I am not a security expert. We have prepared spring restfull web service with spring security.
Now I really have confusion about what is the best approach to secure our web service.
We are going to have SSL connection as well. Our web service will be use by our mobile application and web application.
I read about Oauth 1.0 and 2.0 protocol is very popular nowadays to authorize web services.
So can anyone guide me should I use Oauth mechanism because it is mostly use for accessing third party data, In our case it is not require but our client approaches to use OAuth2.0 or SSL with SHA hashing algorithm is just fine to secure web service?
If there are no third-party client applications which access your web service, OAuth 2.0 is not needed. Probably, HTTPS + Basic Authentication is enough.
If there is a possibility that you may feel like allowing third-party client applications to access your web service in the future, it is worth designing your Web APIs based on the OAuth 2.0 architecture from the beginning. In such a case, it is "Client Credentials Flow" that you will want to implement first among the four flows defined in RFC 6749 (OAuth 2.0). "Client Credentials Flow" does not require authorization by an end-user. That is, the flow cares about only client credentials (client ID and client secret). The initial implementation of your Client Credentials Flow would issue an access token only to your client application.
My one-sentence definition of OAuth 2.0 is as follows.
OAuth 2.0 is a framework where a user of a service can allow a
third-party application to access his/her data hosted in the service
without revealing his/her credentials (ID & password) to the
application.
Whether you should adopt OAuth 2.0 or not depends on whether third-party client applications access your web service or not.
Related
We have a Java 8 backend application using SprintBoot with an embedded Jetty server.
The UI for the application is a Single Page Application built using React.
Currently I have enabled authentication by integrating with Okta using the spring security SAML extension. When the assertion is posted by Okta to my app, I create a session and the JSESSIONID is sent in the cookie.
This was fine until now when we had a very simple UI serving few UI components.
However, now we have several REST endpoints in our backend and we would want them to be authenticated as well. REST endpoints themselves are developed using Jersey.
If I understand correctly, SAML is clearly not the choice for pure REST based endpoints as SAML is mainly a browser based protocol. These REST endpoints will be called by our UI as well we want them to be independently called via Postman or something for testing.
When a client would call these REST APIs, I am guessing the client should send an Authorization header which should be checked by one of the authentication filters in the backend. After validating the client and the user, the filter should inject the user information in the SecurityContext because Jersey injects SecurityContext in all of the REST endpoints. Then it becomes easier to fetch the user from this SecurityContext.
Upon reading, it seems Okta OpenID Connect can be one choice which issues a JWT. However I am not clear on how to use this. That is, when Okta issues a JWT should our UI or any client for that matter keep sending the JWT in the Authorization header to our APIs and then our APIs in turn should send the JWT to Okta to validate it?
Question is what is the best choice to serve both, a login for the UI and a session and authenticating REST endpoints? Not to mention the REST APIs will be stateless in nature.
When a client would call these REST APIs, I am guessing the client
should send an Authorization header which should be checked by one of
the authentication filters in the backend
In OpendID Connect (OIDC), that value in the Authorization header is id_token which can be in JWT format. This id_token is issued by the OIDC server as the last step for whichever OIDC grant type you choose and applicable to your case.
Upon reading, it seems Okta OpenID Connect can be one choice which
issues a JWT. However I am not clear on how to use this. That is, when
Okta issues a JWT should our UI or any client for that matter keep
sending the JWT in the Authorization header to our APIs and then our
APIs in turn should send the JWT to Okta to validate it?
Think that you have 3 components in this architecture. Relying Party (client), Identity Server / Authorization Server / OIDC Provider and Resource Server (your backend and it's data). When Authorization Server issues and id_token to Relying Party, your Resource Server also knows this token. So when you request for data in resource server, you will present your id_token to Resource Server and it knows if it is valid id_token or not
Question is what is the best choice to serve both, a login for the UI
and a session and authenticating REST endpoints?
OIDC Provider (or Identity Server if you need more complex operation), since OIDC is Authorization (OAuth 2.0 at core) and Authentication.
I am struggling with SAML based authentication for SOAP Web Services from last couple of days. I have gone through tons of tutorials to understand the concepts and setting up SAML authentication in my local environment. However, I am not getting couple of things on it.
I have created and hosted the web services and written consumer to access those services (With Java). I have also set up OpenAM to act as Security Token Service (STS)/Identity Provider (As described in most of the tutorials).
My understanding on SAML authentication for Web Services are as below:
A Web Service consumer should authenticate itself with some means (e.g. credentials) and get a SAML response token with certain assertions from a Security Token Service (STS)/Identity Provider (IdP).
Service Consumer then present the SAML token to the Web Service it is accessing and based on the authentication, web service will decide to access/deny.
I am not able to understand following things:
How can I configure OpenAM correctly as STS/IdP. Most of the tutorials I have seen on OpenAM are focused on Single Sign On (SSO) and configuring IdP/SP for the same. Also many of them are on LDAP context.
What changes I have to do in service consumer so that it will request for a SAML token before accessing the services.
How web services will validate the SAML token and allow the consumer to access the service.
I am developing a application which uses Spring Rest services. I am using basic auth for authentication. I know that it is unsecure. My end client are capable of handling OAuth. I want to use OAuth, can any one point me to how to do OAuth in Java. I saw some examples they mention about Twitter , Google and Facebook.But I don't want to use social networking sites.
OAuth is a concept, and not any library which you can inject, (of course libraries exists to implement that)
So if you want to have OAuth in your application (i.e your application has its own OAuth), you have to setup following things
Authentication Server
Provide Provision to Manage OAuth Clients
Manage AccessTokens
Check out the OAuth 2.0 Specification to get clear understanding of how it works and how to build your own.
https://www.rfc-editor.org/rfc/rfc6749
I'm trying to set up a SSO between a webapp and a REST API, to do this I'm using Apache Shiro + Jasig CAS but now I'm having a problem related to the authentication of the REST API.
I'm using CASRealm + CASFilter in the Webapp and trying to use the session created there to access the REST API, I've tried 2 approaches:
propagating the CAS service ticket from the webapp to the REST API through the request header (does not work, it says the service ticket is invalid because it belongs to another app, maybe the TGT would work)
store the username and password in the webapp and use them in http basic authentication (this might be a big security flaw, I'm trying to avoid it)
What other approach can I use to authenticate the user in the REST API?
I guess this is mainly an architecture issue.
Please ask questions if you didn't understand my question (or my english)
It looks like you want to use the first CAS service as a proxy for your REST API: you could use the CAS proxy mechanism: https://wiki.jasig.org/display/CAS/Proxy+CAS+Walkthrough. Though, the proxy support is not available in the Shiro CAS module, you should use the buji-pac4j extension, here is a good discussion on this topic: http://shiro-user.582556.n2.nabble.com/Shiro-cas-proxying-td7579694.html.
You can enable the OAuth2.0 configuration on CAS and then u can secure your REST services with the oauth2.0. For example u can have a rest service with oauth for user authentication. Here some usefull links.
OAuth configuration
Securing REST
OAuth and REST
I have an application runs on Java Spring 3. My application uses RESTful services and Spring Security for security. It has a user table and checks user credentials from it. I implemented web service capability to my application(one of customer's wanted web services instead of RESTful services). If possible I want same authentication mechanism and want to look up that database and allow just one user (for now-to admin) to communicate with my web service server.
Should I follow the same way as like my RESTful authentication or is there any authentication and security mechanism for Java Web Services at Spring (i.e. how to deal with logout, how to enable logout mechanism for a client-server web services communication)
PS: I use Apache-CXF.
Two potential ways:
Put a BasicAuthenticationFilter or DigestAuthenticationFilter in front of your CXF Servlet.
Use a WS-Security UsernamePasswordToken with CXF and write a CallbackHandler that a) creates a UsernamePasswordAuthenticationToken, b) calls authenticationManager.authenticate() and c) stores the authentication in the SecurityContextHolder.
Note that the above doesn't cover the concept of logout since login sessions are generally implemented with cookies and the above are stateless approaches. If you really need logout then you should consider using OAuth because you can implement logout by invalidating access tokens.
You could put a security token in the HTTP header you are sending to the REST which the REST decodes and verifies it's coming from an administrative location.