Informationen zur Authentifizierung zwischen Java-Anwendungen und Oracle Identity Cloud Service
Sie können sich mit der Authentifizierung zwischen Java-Webanwendungen und Oracle Identity Cloud Service vertraut machen. Dazu gehören die folgenden Themen:
-
Der dreibeinige Authentifizierungsfluss, den Oracle Identity Cloud Service für das Java-SDK unterstützt
-
Anwendungsfälle für die Verwendung eines SDK mit einer Java-Anwendung zur Authentifizierung mit Oracle Identity Cloud Service
-
Methoden und Funktionen des Java-SDK
Informationen zu Authentifizierungsabläufen mit drei Schlüsseln
Oracle Identity Cloud Service unterstützt den dreibeinigen Authentifizierungsfluss für das Java-SDK. In diesem Ablauf interagieren Benutzer direkt mit Oracle Identity Cloud Service. Nachdem sich ein Benutzer angemeldet hat, gibt Oracle Identity Cloud Service einen Autorisierungscode aus, den das SDK für ein Benutzerzugriffstoken austauscht. Die Java-Webanwendung verwendet dieses Zugriffstoken, um Benutzern Zugriff auf die geschützten Ressourcen in der Anwendung zu erteilen. Der dreibeinige Ablauf verwendet den Berechtigungstyp für den Autorisierungscode.
Zur Erhöhung der Sicherheit empfiehlt Oracle, Java-Webanwendungen mit dem dreibeinigen Ablauf zur Authentifizierung in Oracle Identity Cloud Service zu integrieren. Mit dem Autorisierungscodezugriffsberechtigungstyp können Sie auch auf andere Anwendungen zugreifen, die durch Oracle Identity Cloud Service geschützt sind, ohne sich erneut authentifizieren zu müssen.
Informationen zu den primären Anwendungsfällen für die Verwendung eines SDK mit einer Java-Anwendung
Die Java-Webanwendung implementiert zwei Anwendungsfälle: einen für die Authentifizierung von Benutzern und den anderen für den Zugriff auf detaillierte Informationen über den angemeldeten Benutzer.
Die folgenden Datenflussdiagramme veranschaulichen den Ablauf von Ereignissen, Aufrufen und Antworten zwischen dem Webbrowser, der Webanwendung und Oracle Identity Cloud Service für jeden Anwendungsfall.
Anwendungsfall 1: Benutzer authentifizieren
Der Datenfluss geschieht auf folgende Weise:
-
Der Benutzer fordert eine geschützte Ressource an.
-
Das Authentifizierungsmodul verwendet das SDK, um eine URL für den Anforderungsautorisierungscode für Oracle Identity Cloud Service zu generieren und diese URL als Umleitungsantwort an den Webbrowser zu senden.
-
Der Webbrowser ruft die URL auf.
-
Die Oracle Identity Cloud Service-Seite Anmelden wird angezeigt.
-
Der Benutzer leitet seine Oracle Identity Cloud Service-Anmeldezugangsdaten weiter.
-
Nachdem sich der Benutzer angemeldet hat, erstellt Oracle Identity Cloud Service eine Session für den Benutzer und gibt einen Autorisierungscode aus.
-
Die Webanwendung führt einen Backend-Aufruf (oder Server-zu-Server-Aufruf) durch, um den Autorisierungscode für ein Zugriffstoken auszutauschen.
-
Oracle Identity Cloud Service gibt ein Zugriffstoken und ein ID-Token aus.
-
Eine Session wird eingerichtet, und der Benutzer wird zur Homepage umgeleitet.
-
Die Seite Home der Webanwendung wird angezeigt.
Anwendungsfall #2: Details zum Benutzer abrufen
Der Datenfluss geschieht auf folgende Weise:
-
Der Benutzer fordert die Ressource
/myProfile
an. -
Die Webanwendung verwendet das SDK von Oracle Identity Cloud Service, um das ID-Token zu validieren.
-
Die Daten, die von der ID-Tokenvalidierung zurückgegeben werden, enthalten Benutzerdetails im Format eines JSON-Objekts.
-
Auf der Seite Mein Profil wird das JSON-Objekt als HTML-Inhalt wiedergegeben.
Informationen zu Methoden und Funktionen
Das Java-SDK ist eine JAR-Datei, die Sie als Webanwendungs-Library laden. Für diese JAR-Datei sind die folgenden Librarys von Drittanbietern erforderlich, die Sie auch in die Library laden müssen:
Die ZIP-Datei des Java-SDK enthält die folgenden erforderlichen Drittanbieter-Librarys, die für das SDK erforderlich sind. Sie können sie in Ihre Anwendung laden.
-
ASM-Helper Minidev 1.0.2
-
Apache Commons Collections 4.1
-
Apache Commons Lang 3.7
-
JSON Small und Fast Parser 2.3
-
Nimbus LangTag 1.4.3
-
Nimbus JOSE+JWT 5.14
-
OAuth 2.0 SDK mit OpenID Connect Extensions 5.30
Oracle stellt eine Beispiel-Java-Webanwendung bereit, um die Verwendung des Java-SDK zu demonstrieren. Diese Anwendung wurde mit Servlet-Technologie erstellt, um die Lernerfahrung zu vereinfachen und zu verstehen, wie das Java-SDK funktioniert. Die Anwendung verwendet Maven, um alle Librarys abzurufen und eine WAR-(Web Application Resource-)Datei zu generieren.
Das Java-SDK erfordert eine HashMap
-Objektinstanz, die mit Oracle Identity Cloud Service-Verbindungsinformationen geladen wird. Die Java-Webanwendung implementiert diese HashMap
-Instanz als Klassenattribut in der Klasse 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;
}
Im Folgenden finden Sie eine kurze Erläuterung der einzelnen erforderlichen Attribute für dieses SDK:
Name | Beschreibung |
---|---|
IDCSTokenAssertionConfiguration.IDCS_HOST |
Das Domainsuffix der Oracle Identity Cloud Service-Instanz. |
IDCSTokenAssertionConfiguration.IDCS_PORT |
Die HTTPS-Portnummer, die für Ihre Oracle Identity Cloud Service-Instanz reserviert ist (in der Regel 443). |
IDCSTokenAssertionConfiguration.IDCS_CLIENT_ID |
Der Wert der Client-ID, die generiert wird, nachdem Sie die Java-Webanwendung in der Identity Cloud Service-Konsole registriert haben. |
IDCSTokenAssertionConfiguration.IDCS_CLIENT_SECRET |
Der Wert des Client Secret, das generiert wird, nachdem Sie die Java-Webanwendung in der Identity Cloud Service-Konsole registriert haben. |
IDCSTokenAssertionConfiguration.IDCS_CLIENT_TENANT |
Das Domainpräfix der Oracle Identity Cloud Service-Instanz. Dieses Präfix ist in der Regel ein Wert ähnlich idcs-abcd1234 .
|
Constants.AUDIENCE_SERVICE_URL |
Die vollqualifizierte Domainnamen-URL Ihrer Oracle Identity Cloud Service-Instanz. |
Constants.TOKEN_ISSUER |
Für dieses Attribut empfiehlt Oracle, dass Sie den Wert https://identity.oraclecloud.com beibehalten.
|
Constants.TOKEN_CLAIM_SCOPE |
Der Geltungsbereich steuert die Daten, auf die die Anwendung im Namen des Oracle Identity Cloud Service-Benutzers zugreifen oder diese verarbeiten kann. Wenn die Anwendung das SDK zur Authentifizierung eines Benutzers verwendet, lautet der Geltungsbereich |
SSLEnabled |
Gibt an, ob Oracle Identity Cloud Service auf HTTPS- oder HTTP-Anforderungen antwortet. Für dieses Attribut empfiehlt Oracle, dass Sie den Wert true beibehalten.
|
Constants.CONSOLE_LOG |
Aktiviert SDK-Log. |
Constants.LOG_LEVEL |
Gibt die Logebene des SDK an. |
Die Anwendung verwendet sowohl die Attribute logoutSufix
als auch redirectURL
, um Hardcode für diese Werte zu vermeiden. Das SDK benötigt sie nicht.
Die Java-Webanwendung implementiert die Klasse AuthServlet
, die den URL /auth
zuordnet. Wenn sich ein Benutzer bei Oracle Identity Cloud Service authentifiziert, fordert der Webbrowser diese URL an. Die Klasse AuthServlet
initialisiert das Objekt Authentication Manager
, generiert mit dem Java-SDK die Autorisierungscode-URL von Oracle Identity Cloud Service und leitet den Webbrowser dann zu dieser URL um.
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);
}
}
Die folgenden Parameter werden zum Generieren der Autorisierungscode-URL verwendet:
Name | Beschreibung |
---|---|
redirectUrl |
Nachdem sich ein Benutzer angemeldet hat, leitet Oracle Identity Cloud Service den Webbrowser des Benutzers zu dieser URL um. Diese URL muss mit der URL übereinstimmen, die Sie für die vertrauenswürdige Anwendung in der Identity Cloud Service-Konsole konfigurieren. Weitere Informationen zum Angeben einer Umleitungs-URL für die Java-Webanwendung finden Sie unter Java-Anwendung registrieren. |
scope |
Der Authentifizierungsgeltungsbereich OAuth oder OpenID Connect. Diese Anwendung erfordert nur die Authentifizierung openid .
|
state |
Das OAuth-Protokoll definiert diesen Parameter. Die Java-Beispielwebanwendung verwendet diesen Code, um zu prüfen, ob die Kommunikation mit Oracle Identity Cloud Service hergestellt werden kann. In diesem Beispiel lautet der Wert für diesen Parameter 1234 .
|
response_type |
Der für den Autorisierungscode-Zuteilungstyp erforderliche Parameter. In diesem Beispiel lautet der Wert für diesen Parameter code .
|
Nachdem sich der Benutzer angemeldet hat, leitet Oracle Identity Cloud Service den Webbrowser des Benutzers an eine Callback-URL um, die der Entwickler implementieren muss. Die Java-Webanwendung verwendet CallbackServlet
, um diese Anforderung zu verarbeiten.
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);
}
}
Die Anwendung fordert den Autorisierungscodeparameter an und ruft damit die Methode AuthenticationManager.authorizationCode()
des Java-SDK auf, um sowohl ein Zugriffstoken als auch ein ID-Token anzufordern. Das Servlet verwendet dann die Instanz AuthenticationManager
, um das ID-Token zu validieren. Die AuthenticationManager.validateIdToken()
-Methoden geben eine Instanz des IdToken
-Objekts zurück, die Benutzerinformationen wie Anzeigename, Benutzer-ID und die Liste der Gruppen und Anwendungsrollen enthält, die dem Benutzer zugewiesen sind. Sowohl Zugriffstoken- als auch ID-Tokenwerte sowie einige Benutzerinformationen werden im HTTP-Sessionobjekt gespeichert, sodass die Anforderung an eine geschützte URL in der Anwendung mit dem Namen /private/home.jsp
weitergeleitet werden kann. Neben /private/home.jsp
verfügt die Java-Webanwendung über weitere geschützte URLs: /private/myProfile.jsp
.
Auf der Seite myProfile.jsp
wird das folgende Codebeispiel verwendet, um weitere Informationen zum Benutzer zu erhalten, der bei Oracle Identity Cloud Service angemeldet ist:
<%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);
%>
Die Seite /private/myProfile.jsp
greift auf den ID-Tokenwert zu, der in der Session festgelegt wurde, ruft die Methode AuthenticationManager.validateIdToken()
auf, um die Benutzerinformationen abzurufen, und zeigt ihn dann als HTML-Inhalt an.
<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>
Um den Benutzer von Single Sign-On zwischen der Anwendung und Oracle Identity Cloud Service abzumelden, implementiert die Java-Webanwendung die LogoutServlet
, die die /logout
-URL zuordnet:
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);
}
}
Dieses Servlet invalidiert die Session der Anwendung und leitet den Webbrowser des Benutzers dann an die Abmelde-URL OAuth von Oracle Identity Cloud Service um.