SAML authentication in spring boot application - saml

Requirement is to build application :
Accept SAML token coming from UI as input in #Controller
Decrypt it using 3DES algorithm
Authentication
covert to JWT token and send back to UI
Is any example custom authentication available?
I tried
https://docs.spring.io/spring-security/reference/servlet/saml2/login/authentication.html
example but it redirect to IDP url, I dont want to redirect to IDP, I don't want to redirect it to IDP url,
I just want to decrypt it by private key and using certificate and authenticate.

Related

How to programmatically extract SAML token for IDP and SP?

I have SSO configured between IDP (ADFS) and SP, and IDP generate SAML token and post to the SP page for authentication. But, I like to create a new application called test-app, and this app should programmatically generate/extract SAML token for IDP and SP by using a pop up login window.
Is it possible?
After I get the SAML token, I intent to use it on a REST webservice of the SP.
The SAML flow requires the SAML token to be generated by the IDP.
The IDP has the private key to sign the SAML token.
You can generate one in your app. but you won't be able to sign it correctly and there is no flow to send it to the IDP.

Flutter with REST backend Springboot

I am developing a Flutter mobile application with a Spring Boot backend. I want to have three types of login methods (1). username & password (2). Facebook (3). Google.
I have following questions.
1) If I handle the Authentication part in the mobile App via Firebase Authentication (And store all the user on Firebase), do I need to write authentication code on my Spring Boot side? Or I need to keep my authentication on the Sprin Bboot side only?
2) I want the JWT token for all the authentication system (Facebook, Google and username & password). The mobile app will send the JWT token for every requests it make to the Springboot app.
3) I am looking for a step by step tutorial that shows how can I integrate all these login methods in my Springboot REST APIs. I have looked many but all they have some different different methods or dependencies. Like some are adding Facebook dependency in the maven and some only add the Oauth2.
Thanking you in advance
You can integrate your Spring Boot back-end with external authentication provider using JWT by defining a custom security filter in your spring boot app. This filter will read the JWT issuer (iss) and define where it comes from (Facebook or Google). Then, based on the provider, use the appropriate public key to verify the signature included in the JWT (normally, you can use the JWKS URI provided by the authentication providers to get the key). If all good, authentication is success.
I use
Flutter
Spring for database access (REST)
Firebase for authentication
The problem was: how do I authenticate REST requests?
The short answer: send the Firebase access token to the Spring server where the token is validated. If it is valid, grant acces. Else return 403 forbidden.
The more detailed answer:
Authenticate in Flutter
FirebaseAuth.instance.signInWithPopup(GoogleAuthProvider())
Get the JWT access token IFF login was successful. (You may rather use userCredential.user instead of currentUser)
FirebaseAuth.instance.currentUser!.getIdToken();
Add the token to your http-request header
final response = await http.get(
Uri.parse('https://example.com/example'),
headers: {
HttpHeaders.authorizationHeader: 'your_api_token_here',
},
);
Then validate the token on server side. Read this for details:
https://firebase.google.com/docs/auth/admin/verify-id-tokens#java
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
Your Spring application will be able validate that the token is correct and not yet expired.
I highly suggest to send the token over https only! Do not use http.

Keycloak as IDP with custom authenticator cant read http POST params login_hint

I have a saml Keycloak client which contains an Authentication Flow Override to a custom keycloak SPI authenticator built in java and deployed in the keycloak env. The authenticator is pretty simple, it displays a username field and takes that username, does a 3rd party check, then returns a verdict (go/nogo, yes/no, etc.)
I have a SAML SP sending a request to this keycloak client (as an IDP). The SP request has a LoginHint. When the Custom Authenticator receives this request in the authenticate method, it cannot retrieve the HTTP Post parameters because there are none.
When user enters their information into the custom authenticators form and clicks submit, and when the action method takes over, the new HTTP POST params are there.
I need to retrieve the loginHint in the authenticate method from the incoming SP SAML request.
anyone know how to do this? i cant read in the login_hint for the life of me.
login_hint and variations thereof belong to OpenID Connect (OIDC) implementations. In SAML you have to use RelayState (recommended) or an authentication request extension.

registering a rest API with OAuth

I have written a web application which makes REST API calls to a message broker. The message broker contains already written REST APIs to which can be used to get message broker data. The message broker is written in a way in which each REST API call sends the user name and password which is encoded with base64. I need to make a login to my web app and authenticate it with OAuth.Does anyone know how to do this? How to authenticate the REST APIs with OAuth?
Step 1: Add OAuth 2.0 to your web server. This is very standard with lots of libraries available. You did not specify the Identity Provider that you will use (Google, Facebook, Auth0, Okta, etc), but each vendor has documents and libraries for you to use in your desired language.
Step 2: Add an Authorization Header to your API calls. The standard method is to add the HTTP header Authorization: Bearer access_token when making an API call.
Step 3: Add OAuth token verification to your API. When your API receives a request, it extracts the Authorization header and verifies the Bearer token. How this is done depends on the Identity Provider. For example, some vendors provide a Signed JWT (which you verify with the vendors public certificate), others provide an opaque access token (which you verify by calling the vendor's token endpoint). Add internal caching of tokens so that you don't need to verify on every API call.
If you understand OAuth 2.0 the above steps are straightforward to implement. If you don't Oracle has a set of videos which are excellent for getting started understanding OAuth.
Oracle Cloud Primers
If your desired OAuth implementation does not require users logging in and is a server to server service that you control on both ends, then you can use just part of OAuth which is Signed JWT (JWS). You create a Json data structure with your desired content and sign it with a private key. This creates a token that you can use in the above steps. You would then validate the token using your public key. You can use self-generated keypairs generated by OpenSSL or similar products for your signing and verification.

How can I add Auth0 as IdP into ADFS?

I've asked this question on Auth0 community but wanted to ask in here also... https://community.auth0.com/t/how-can-i-add-auth0-as-idp-into-adfs/16868
I want to use Auth0 as an IdP for my application. So here is the flow:
Web Application --> ADFS --> Auth0 --> Social
I’ve red this link and did whatever it says; in order to add Auth0 as a Claims Provider into ADFS I’ve used the SAML Metadata URL. As a result I can now select Auth0 as IdP (or CP in ADFS terms) on ADFS login page and it redirects user to log in on Auth0. And client can authenticate on Auth0 with no doubt. But, when ADFS receives the HTTP POST SAML response from Auth0 it throws an error “MSIS0050: SAML Response does not match SAML request.”. And thus, client cannot login to web app.
Here are the details of the exception:
Encountered error during federation passive request.
Additional Data
Protocol Name:
Saml
Relying Party:
Exception details:
Microsoft.IdentityServer.Web.UnsupportedSamlResponseException: MSIS0050: SAML Response does not match SAML request. Request ID: id-2252c816-02de-423c-b518-703cbfd26055, response InResponseTo:
at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.GetSecurityTokenFromSignInResponse(ProtocolContext context)
at Microsoft.IdentityServer.Web.PassiveProtocolListener.ProcessProtocolRequest(ProtocolContext protocolContext, PassiveProtocolHandler protocolHandler)
at Microsoft.IdentityServer.Web.PassiveProtocolListener.OnGetContext(WrappedHttpListenerContext context)
So, What can be the problem here? Can you please help me on this?
My fault. For ADFS integration, on Auth0, selection of SAML2 integration medium was a bad idea. I just selected ADFS and it's working now. Thank you.