En savoir plus sur l'authentification entre les applications Java et Oracle Identity Cloud Service
Vous êtes prêt à vous familiariser avec l'authentification entre les applications Web Java et Oracle Identity Cloud Service. Cela comprend les différences suivantes :
-
Flux d'authentification à trois facteurs pris en charge par Oracle Identity Cloud Service pour le SDK Java
-
Cas d'emploi d'un kit SDK avec une application Java pour l'authentification auprès de Oracle Identity Cloud Service
-
Méthodes et fonctions du kit SDK Java
En savoir plus sur les flux d'authentification 3D
Oracle Identity Cloud Service prend en charge le flux d'authentification à trois facteurs pour le SDK Java. Dans ce flux, les utilisateurs interagissent directement avec Oracle Identity Cloud Service. Après la connexion d'un utilisateur, Oracle Identity Cloud Service émet un code d'autorisation que le SDK échange pour un jeton d'accès utilisateur. L'application Web Java utilise ce jeton d'accès pour accorder aux utilisateurs un accès aux ressources protégées de l'application. Le flux à trois facteurs utilise le type d'octroi de code d'autorisation.
Pour une sécurité accrue, Oracle recommande d'utiliser le flux à trois facteurs afin d'intégrer vos applications Web Java à Oracle Identity Cloud Service pour l'authentification. En utilisant le type d'octroi de code d'autorisation, vous pouvez également accéder à d'autres applications protégées par Oracle Identity Cloud Service sans avoir à vous authentifier à nouveau.
En savoir plus sur les cas d'emploi principaux pour l'utilisation d'un kit SDK avec une application Java
L'application Web Java implémente deux cas d'emploi : un pour l'authentification des utilisateurs et l'autre pour l'accès aux informations détaillées sur l'utilisateur connecté.
Les diagrammes de flux de données suivants illustrent le flux d'événements, d'appels et de réponses entre le navigateur Web, l'application Web et Oracle Identity Cloud Service pour chaque cas d'emploi.
Cas d'emploi n ° 1 : authentifier un utilisateur
Le flux de données se produit de la façon suivante :
-
L'utilisateur demande une ressource protégée.
-
Le module d'authentification utilise le kit SDK pour générer une URL request-authorization-code pour Oracle Identity Cloud Service et envoyer cette URL en tant que réponse de réacheminement au navigateur Web.
-
Le navigateur Web appelle l'URL.
-
La page Connexion à Oracle Identity Cloud Service apparaît.
-
L'utilisateur soumet ses informations d'identification de connexion à Oracle Identity Cloud Service.
-
Une fois que l'utilisateur s'est connecté, Oracle Identity Cloud Service crée une session pour l'utilisateur et émet un code d'autorisation.
-
L'application Web effectue un appel back-end (ou de serveur à serveur) pour échanger le code d'autorisation d'un jeton d'accès.
-
Oracle Identity Cloud Service émet un jeton d'accès et un jeton d'ID.
-
Une session est établie et l'utilisateur est redirigé vers la page d'accueil.
-
La page d'accueil de l'application Web apparaît.
Cas d'emploi n ° 2 : obtenir des détails sur l'utilisateur
Le flux de données se produit de la façon suivante :
-
L'utilisateur demande la ressource
/myProfile
. -
L'application Web utilise le kit SDK de Oracle Identity Cloud Service pour valider le jeton d'ID.
-
Les données renvoyées par la validation du jeton d'ID contiennent les détails de l'utilisateur au format d'un objet JSON.
-
La page Mon profil affiche l'objet JSON en tant que contenu HTML.
En savoir plus sur les méthodes et les fonctions
Le kit SDK Java est un fichier JAR que vous chargez en tant que bibliothèque d'applications Web. Ce fichier JAR requiert les bibliothèques tierces suivantes, que vous devez également charger dans la bibliothèque :
Le fichier ZIP du kit SDK Java contient les bibliothèques tierces requises suivantes pour le kit SDK. Vous pouvez les charger dans votre application.
-
Helper ASM Minidev 1.0.2
-
Apache Commons Collections 4.1
-
Apache Commons Lang 3.7
-
2.3 d'analyseur rapide et petit JSON
-
1.4.3 LangTag Nimbus
-
JOSE+JWT 5.14 Nimbus
-
SDK OAuth 2.0 avec OpenID Connect Extensions 5.30
Oracle fournit un exemple d'application Web Java qui montre comment utiliser le kit SDK Java. Cette application a été conçue à l'aide de la technologie de servlet pour simplifier l'expérience d'apprentissage et comprendre le fonctionnement du kit SDK Java. L'application utilise Maven pour obtenir toutes les bibliothèques et générer un fichier WAR (Web Application Resource).
Le kit SDK Java requiert une instance d'objet HashMap
chargée avec les informations de connexion Oracle Identity Cloud Service. L'application Web Java implémente cette instance HashMap
en tant qu'attribut de classe dans la classe ConnectionOptions.java
.
//Instance of a HashMap.
private Map<String,Object> options = new HashMap<>();
public ConnectionOptions(){
this.options = new HashMap<>();
}
public Map<String,Object> getOptions(){
//Adding Oracle Identity Cloud Service connection parameters to the HashMap instance.
this.options.put(IDCSTokenAssertionConfiguration.IDCS_HOST, "identity.oraclecloud.com");
this.options.put(IDCSTokenAssertionConfiguration.IDCS_PORT, "443");
this.options.put(IDCSTokenAssertionConfiguration.IDCS_CLIENT_ID, "123456789abcdefghij");
this.options.put(IDCSTokenAssertionConfiguration.IDCS_CLIENT_SECRET, "abcde-12345-zyxvu-98765-qwerty");
this.options.put(IDCSTokenAssertionConfiguration.IDCS_CLIENT_TENANT, "idcs-abcd1234");
this.options.put(Constants.AUDIENCE_SERVICE_URL, "https://idcs-abcd1234.identity.oraclecloud.com");
this.options.put(Constants.TOKEN_ISSUER, "https://identity.oraclecloud.com/");
this.options.put(Constants.TOKEN_CLAIM_SCOPE, "urn:opc:idm:t.user.me openid");
this.options.put("SSLEnabled", "true");
this.options.put("redirectURL", "http://localhost:8080/callback");
this.options.put("logoutSufix", "/oauth2/v1/userlogout");
this.options.put(Constants.CONSOLE_LOG, "True");
this.options.put(Constants.LOG_LEVEL, "DEBUG");
return this.options;
}
Voici une brève explication de chaque attribut obligatoire pour ce SDK :
Nom | Description |
---|---|
IDCSTokenAssertionConfiguration.IDCS_HOST |
Suffixe de domaine de votre instance Oracle Identity Cloud Service. |
IDCSTokenAssertionConfiguration.IDCS_PORT |
Numéro de port HTTPS réservé à votre instance Oracle Identity Cloud Service (généralement 443). |
IDCSTokenAssertionConfiguration.IDCS_CLIENT_ID |
Valeur de l'ID client généré après l'inscription de l'application Web Java dans la console Identity Cloud Service. |
IDCSTokenAssertionConfiguration.IDCS_CLIENT_SECRET |
Valeur de la clé secrète du client générée après l'inscription de l'application Web Java dans la console Identity Cloud Service. |
IDCSTokenAssertionConfiguration.IDCS_CLIENT_TENANT |
Préfixe de domaine de votre instance Oracle Identity Cloud Service. Ce préfixe est généralement une valeur semblable à idcs-abcd1234 .
|
Constants.AUDIENCE_SERVICE_URL |
URL de nom de domaine qualifié complet de l'instance Oracle Identity Cloud Service. |
Constants.TOKEN_ISSUER |
Pour cet attribut, Oracle recommande de conserver la valeur https://identity.oraclecloud.com .
|
Constants.TOKEN_CLAIM_SCOPE |
La portée contrôle les données auxquelles l'application peut accéder ou traiter pour le compte de l'utilisateur Oracle Identity Cloud Service. Si l'application utilise le kit SDK pour authentifier un utilisateur, la portée est |
SSLEnabled |
Indique si Oracle Identity Cloud Service répond aux demandes HTTPS ou HTTP. Pour cet attribut, Oracle recommande de conserver la valeur true .
|
Constants.CONSOLE_LOG |
Active la journalisation SDK. |
Constants.LOG_LEVEL |
Indique le niveau de journalisation du kit SDK. |
L'application utilise à la fois les attributs logoutSufix
et redirectURL
pour éviter de coder ces valeurs en dur. Le kit SDK ne les exige pas.
L'application Web Java implémente la classe AuthServlet
, qui met en correspondance l'URL /auth
. Lorsqu'un utilisateur décide de s'authentifier auprès de Oracle Identity Cloud Service, le navigateur Web envoie une demande à cette URL. La classe AuthServlet
initialise l'objet Authentication Manager
, utilise le kit SDK Java pour générer l'URL du code d'autorisation Oracle Identity Cloud Service, puis redirige le navigateur Web vers cette URL.
public class AuthServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Loading the configurations
Map<String, Object> options = new ConnectionOptions().getOptions();
//Configuration object instance with the parameters loaded.
IDCSTokenAssertionConfiguration config = new IDCSTokenAssertionConfiguration(options);
String redirectUrl = (String)options.get("redirectURL");
String scope = (String)options.get(Constants.TOKEN_CLAIM_SCOPE);
//Authentication Manager loaded with the configurations.
AuthenticationManager am = AuthenticationManagerFactory.getInstance(config);
//Using Authentication Manager to generate the Authorization Code URL, passing the
//application's callback URL as parameter, along with code value and code parameter.
String authzURL = am.getAuthorizationCodeUrl(redirectUrl, scope, "1234", "code");
//Redirecting the browser to the Oracle Identity Cloud Service Authorization URL.
response.sendRedirect(authzURL);
}
}
Les paramètres suivants permettent de générer l'URL de code d'autorisation :
Nom | Description |
---|---|
redirectUrl |
Une fois l'utilisateur connecté, Oracle Identity Cloud Service redirige le navigateur Web de l'utilisateur vers cette URL. Cette URL doit correspondre à celle que vous configurerez pour l'application sécurisée dans la console Identity Cloud Service. Pour plus d'informations sur la spécification d'une URL de réacheminement pour l'application Web Java, reportez-vous à Inscrire l'application Java. |
scope |
Portée d'authentification de OAuth ou de OpenID. Cette application requiert uniquement l'authentification openid .
|
state |
Le protocole OAuth définit ce paramètre. L'exemple d'application Web Java utilise ce code pour vérifier si la communication peut être établie avec Oracle Identity Cloud Service. Pour cet exemple, la valeur de ce paramètre est 1234 .
|
response_type |
Paramètre requis par le type d'octroi de code d'autorisation. Pour cet exemple, la valeur de ce paramètre est code .
|
Une fois l'utilisateur connecté, Oracle Identity Cloud Service redirige le navigateur Web de l'utilisateur vers une URL de callback, que le développeur doit implémenter. L'application Web Java utilise CallbackServlet
pour gérer cette demande.
public class CallbackServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Loading the configurations
Map<String, Object> options = new ConnectionOptions().getOptions();
//After Oracle Identity Cloud Service authenticates the user, the browser is redirected to the
//callback URL, implemented as a Servlet.
IDCSTokenAssertionConfiguration config = new IDCSTokenAssertionConfiguration(options);
//Authentication Manager loaded with the configurations.
AuthenticationManager am = AuthenticationManagerFactory.getInstance(config);
//Getting the authorization code from the "code" parameter
String authzCode = request.getParameter("code");
//Using the Authentication Manager to exchange the Authorization Code to an Access Token.
AuthenticationResult ar = am.authorizationCode(authzCode);
//Getting the Access Token object and its String value.
AccessToken access_token = ar.getToken(OAuthToken.TokenType.ACCESS_TOKEN);
String access_token_string = access_token.getToken();
//Getting the ID Token object and its String value.
IdToken id_token = ar.getToken(OAuthToken.TokenType.ID_TOKEN);
String id_token_string = id_token.getToken();
//Validating both Tokens to acquire information for User such as UserID,
//DisplayName, list of groups and AppRoles assigned to the user.
IdToken id_token_validated = am.validateIdToken(id_token_string);
//Storing information into the HTTP Session.
HttpSession session=request.getSession();
session.setAttribute("access_token", access_token_string);
session.setAttribute("id_token", id_token_string);
session.setAttribute("userId", id_token_validated.getUserId());
session.setAttribute("displayName", id_token_validated.getDisplayName());
//Forwarding the request to the Home page.
request.getRequestDispatcher("private/home.jsp").forward(request, response);
}
}
L'application demande le paramètre de code d'autorisation et l'utilise pour appeler la méthode AuthenticationManager.authorizationCode()
du SDK Java afin de demander à la fois un jeton d'accès et un jeton d'ID. Le servlet utilise alors l'instance AuthenticationManager
pour valider le jeton d'ID. Les méthodes AuthenticationManager.validateIdToken()
renvoient une instance de l'objet IdToken
contenant des informations utilisateur telles que le nom d'affichage, l'ID utilisateur, ainsi que la liste des groupes et des rôles d'application affectés à l'utilisateur. Les valeurs de jeton d'accès et d'ID, et certaines informations utilisateur sont stockées dans l'objet de session HTTP pour que la demande puisse être transmise à une URL protégée dans l'application appelée /private/home.jsp
. En plus de /private/home.jsp
, l'application Web Java dispose d'une autre version protégée de URLs : /private/myProfile.jsp
.
La page myProfile.jsp
utilise l'exemple de code suivant pour obtenir plus d'informations sur l'utilisateur connecté à Oracle Identity Cloud Service :
<%if(session.getAttribute("access_token")==null) response.sendRedirect("/login.html");%>
<!DOCTYPE html>
<%
/**
* The /private/myProfile.jsp page accesses the user's access token previously set in the session,
* calls the getAuthenticatedUser method to retrieve the user's information, and then formats it as HTML.
* @author felippe.oliveira@oracle.com
* @Copyright Oracle
*/
java.util.Map<String, Object> options = new sampleapp.util.ConnectionOptions().getOptions();
//Configuration object instance with the parameters loaded.
oracle.security.jps.idcsbinding.shared.IDCSTokenAssertionConfiguration configuration = new oracle.security.jps.idcsbinding.shared.IDCSTokenAssertionConfiguration(options);
oracle.security.jps.idcsbinding.shared.AuthenticationManager am = oracle.security.jps.idcsbinding.shared.AuthenticationManagerFactory.getInstance(configuration);
//Getting the Access Token and the Id Token from the session object
String access_token_string = (String)session.getAttribute("access_token");
String id_token_string = (String)session.getAttribute("id_token");
//Validating the ID Token to get user information, groups and app roles associated with the user.
oracle.security.jps.idcsbinding.api.AccessToken access_token_validated = am.validateAccessToken(access_token_string);
oracle.security.jps.idcsbinding.api.IdToken id_token_validated = am.validateIdToken(id_token_string);
%>
La page /private/myProfile.jsp
accède à la valeur de jeton d'ID définie dans la session, appelle la méthode AuthenticationManager.validateIdToken()
pour extraire les informations de l'utilisateur, puis la présente en tant que contenu HTML.
<p><b>Information from the Identity Token:</b></p><p><%
out.println("DisplayName = "+ id_token_validated.getDisplayName() +"<br>");
out.println("IdentityDomain = "+ id_token_validated.getIdentityDomain() +"<br>");
out.println("UserName = "+ id_token_validated.getUserName()+"<br>");
out.println("UserId = "+ id_token_validated.getUserId()+"<br>");
out.println("Issuer = "+ id_token_validated.getIssuer()+"<br>");
java.util.List<oracle.security.jps.idcsbinding.api.IDCSAppRole> appRoles = id_token_validated.getAppRoles();
if(!appRoles.isEmpty()){
out.println("App Roles:<br>");
for(oracle.security.jps.idcsbinding.api.IDCSAppRole appRole: appRoles){
out.println(" appRole = "+ appRole.getName() +"<br>");
}//for
}//if
java.util.List<oracle.security.jps.idcsbinding.api.IDCSGroup> groups = id_token_validated.getGroupMembership();
if(!groups.isEmpty()){
out.println("Groups:<br>");
for(oracle.security.jps.idcsbinding.api.IDCSGroup group: groups){
out.println(" group = "+ group.getName() +"<br>");
}//for
}//if
%>
</p>
<p><b>Access Token:</b></p><p><%=access_token_string%></p>
Pour déconnecter l'utilisateur de l'accès avec connexion unique (SSO) entre l'application et Oracle Identity Cloud Service, l'application Web Java implémente LogoutServlet
, qui met en correspondance l'URL de /logout
:
public class LogoutServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session=request.getSession();
String id_token = (String)session.getAttribute("id_token");
session.invalidate();
Map options = new ConnectionOptions().getOptions();
String logoutURL = (String)options.get(Constants.AUDIENCE_SERVICE_URL) + (String)options.get("logoutSufix") +"?post_logout_redirect_uri=http%3A//localhost%3A8080&id_token_hint="+ id_token;
response.sendRedirect(logoutURL);
}
}
Ce servlet invalide la session de l'application, puis redirige le navigateur Web de l'utilisateur vers l'URL de déconnexion OAuth de Oracle Identity Cloud Service.