Informationen zur Authentifizierung zwischen Java -Anwendungen und Oracle Identity Cloud Service

Sie möchten sich mit der Authentifizierung zwischen Java -Webanwendungen und Oracle Identity Cloud Service vertraut machen. Dies umfasst die folgenden Kenntnisse:

  • Der dreibeinige Authentifizierungs-Flow, 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 überlappenden Authentifizierungsflüssen

Oracle Identity Cloud Service unterstützt den dreibeinigen Authentifizierungs-Flow 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 Flow verwendet den Berechtigungscodeerteilungstyp.

Für höhere Sicherheit empfiehlt Oracle, dass Sie den dreibeinigen Fluss verwenden, um Ihre Java -Webanwendungen in Oracle Identity Cloud Service zur Authentifizierung zu integrieren. Wenn Sie den Berechtigungstyp für den Autorisierungscode verwenden, können Sie auch auf andere Anwendungen zugreifen, die von Oracle Identity Cloud Service geschützt sind, ohne sich erneut authentifizieren zu müssen.

Weitere 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.

In den folgenden Datenflussdiagrammen wird der Fluss von Ereignissen, Aufrufen und Antworten zwischen dem Webbrowser, der Webanwendung und Oracle Identity Cloud Service für jeden Anwendungsfall dargestellt.

Anwendungsfall #1: Benutzer authentifizieren

Der Datenfluss wird wie folgt ausgeführt:

  1. Der Benutzer benötigt eine geschützte Ressource.

  2. Das Authentifizierungsmodul verwendet das SDK, um eine request-authorization-code-URL für Oracle Identity Cloud Service zu generieren und diese URL als Umleitungsantwort an den Webbrowser zu senden.

  3. Der Webbrowser ruft die URL auf.

  4. Die Anmeldeseite für Oracle Identity Cloud Service wird angezeigt.

  5. Der Benutzer leitet seine Zugangsdaten für die Oracle Identity Cloud Service -Anmeldung weiter.

  6. Nachdem sich der Benutzer angemeldet hat, erstellt Oracle Identity Cloud Service eine Session für den Benutzer und gibt einen Autorisierungscode aus.

  7. Die Webanwendung erstellt einen Backend- (oder Server-zu-Server-) Aufruf zum Austausch des Autorisierungscodes für ein Zugriffstoken.

  8. Oracle Identity Cloud Service gibt ein Zugriffstoken und ein ID-Token aus.

  9. Eine Session wird hergestellt, und der Benutzer wird auf die Homepage umgeleitet.

  10. Die Homepage der Webanwendung wird angezeigt.

Anwendungsfall #2: Details zum Benutzer abrufen

Der Datenfluss wird wie folgt ausgeführt:

  1. Der Benutzer fordert die /myProfile -Ressource an.

  2. Die Webanwendung verwendet Oracle Identity Cloud ServiceSDK zur Validierung des ID-Tokens.

  3. Die Daten, die aus der ID-Tokenvalidierung zurückgegeben werden, enthalten die Details des Benutzers im Format eines JSON-Objekts.

  4. Auf der Seite "Mein Profil " wird das JSON-Objekt als HTML-Inhalt wiedergegeben.

Weitere Informationen zu Methoden und Funktionen

Das Java -SDK ist eine JAR-Datei, die Sie als Webanwendungs-Library laden. Diese JAR-Datei erfordert die folgenden Fremdbibliotheken, die Sie auch in die Library laden müssen:

Die Java -SDK-ZIP-Datei enthält die folgenden erforderlichen Drittanbieter-Librarys für das SDK. 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 Klein- und schnelle 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, mit der die Verwendung von Java SDK veranschaulicht wird. Diese Anwendung wurde mit Servlet-Technologie erstellt, um das Lernen zu vereinfachen und zu verstehen, wie das Java -SDK funktioniert. Die Anwendung verwendet Maven, um alle Librarys abzurufen und eine Webanwendungsressourcen- (WAR -) Datei zu generieren.

Das Java -SDK erfordert eine HashMap -Objektinstanz, die mit Oracle Identity Cloud Service -Verbindungsinformationen geladen wurde. Die Java -Webanwendung implementiert diese HashMap -Instanz als Klassenattribut in der ConnectionOptions.java -Klasse.

//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 jedes erforderlichen Attributs 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 (normalerweise 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 Ihrer Oracle Identity Cloud Service -Instanz. Dieses Präfix ist in der Regel ein Wert, der idcs-abcd1234 ähnelt.
Constants.AUDIENCE_SERVICE_URL Die vollständige Domain-Name-URL der 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 zugreifen oder sie für den Oracle Identity Cloud Service -Benutzer verarbeiten kann.

Wenn die Anwendung das SDK zur Authentifizierung eines Benutzers verwendet, lautet der Geltungsbereich openid. Wenn die Anwendung auch das SDK verwendet, um Details zu dem Benutzer abzurufen, ist der Geltungsbereich urn:opc:idm:t.user.me openid.

SSLEnabled Gibt an, ob Oracle Identity Cloud Service auf HTTPS- oder HTTP-Anforderungen reagiert. Für dieses Attribut empfiehlt Oracle, dass Sie den Wert true beibehalten.
Constants.CONSOLE_LOG Aktiviert das SDK-Log.
Constants.LOG_LEVEL Gibt die Logebene des SDKs an.

Die Anwendung verwendet sowohl die Attribute logoutSufix als auch redirectURL, um Hartcodes für diese Werte zu vermeiden. Das SDK erfordert sie nicht.

Die Java -Webanwendung implementiert die AuthServlet -Klasse, die die /auth -URL zuordnet. Wenn ein Benutzer sich für die Authentifizierung mit Oracle Identity Cloud Service entscheidet, fordert der Webbrowser eine Anforderung an diese URL an. Die AuthServlet -Klasse initialisiert das Authentication Manager -Objekt, verwendet das Java -SDK, um die Autorisierungscode-URL von Oracle Identity Cloud Service zu generieren, und leitet dann den Webbrowser an diese 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 an diese 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 über die Angabe einer Umleitungs-URL für die Java -Webanwendung finden Sie unter Java -Anwendung registrieren.
scope Der Geltungsbereich von OAuth oder OpenID Connect der Authentifizierung. Diese Anwendung erfordert nur die openid -Authentifizierung.
state Das OAuth -Protokoll definiert diesen Parameter. Die Beispiel- Java -Webanwendung verwendet diesen Code, um zu prüfen, ob eine Kommunikation mit Oracle Identity Cloud Service aufgebaut werden kann. In diesem Beispiel ist der Wert für diesen Parameter 1234.
response_type Der für den Berechtigungscodeerteilungstyp erforderliche Parameter. In diesem Beispiel ist der Wert für diesen Parameter code.

Nach der Anmeldung des Benutzers leitet Oracle Identity Cloud Service den Webbrowser des Benutzers zu einer Callback-URL um, die der Entwickler implementieren muss. Die Java -Webanwendung verwendet CallbackServlet zur Verarbeitung dieser Anforderung.

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 AuthenticationManager.authorizationCode() -Methode von Java SDK auf, sowohl ein Zugriffstoken als auch ein ID-Token anzufordern. Das Servlet verwendet dann die AuthenticationManager -Instanz zur Validierung des ID-Tokens. Die AuthenticationManager.validateIdToken() -Methoden geben eine Instanz des IdToken -Objekts zurück, die Benutzerinformationen wie Anzeigename, Benutzer-ID und Liste der Gruppen und Anwendungsrollen enthält, die dem Benutzer zugewiesen sind. Zugriffstoken und ID-Tokenwerte sowie einige Benutzerinformationen werden im HTTP-Sessionobjekt gespeichert, sodass die Anforderung an eine geschützte URL innerhalb der Anwendung namens /private/home.jsp weitergeleitet werden kann. Zusätzlich zu /private/home.jsp verfügt die Java -Webanwendung über eine andere geschützte URLs: /private/myProfile.jsp.

Die Seite myProfile.jsp verwendet das folgende Codebeispiel, um weitere Informationen zu dem Benutzer abzurufen, 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 AuthenticationManager.validateIdToken() -Methode 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("&nbsp;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("&nbsp;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 den LogoutServlet, der 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 Anwendungssession und leitet dann den Webbrowser des Benutzers an die Abmelde-URL von Oracle Identity Cloud ServiceOAuth um.