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

Sie können sich mit der Authentifizierung zwischen Python-Webanwendungen und Oracle Identity Cloud Service vertraut machen. Dazu gehören die folgenden Themen:

  • Anwendungsfälle für die Verwendung eines SDK mit einer Python-Anwendung zur Authentifizierung mit Oracle Identity Cloud Service.

  • Der dreibeinige Authentifizierungsfluss, den Oracle Identity Cloud Service für das Python-SDK unterstützt

  • Methoden und Funktionen des Python-SDK

Informationen zu Authentifizierungsabläufen mit drei Schlüsseln

Oracle Identity Cloud Service unterstützt den dreibeinigen Authentifizierungsfluss für das Python-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. Dieses Zugriffstoken kann von der Python-Anwendung verwendet werden, um Benutzern Zugriff auf die geschützten Ressourcen in der Anwendung zu erteilen. Der dreibeinige Ablauf verwendet den Berechtigungstyp für den Autorisierungscode.

Um die Sicherheit zu erhöhen, empfiehlt Oracle, Ihre Python-Webanwendungen zur Authentifizierung mit dreiteiligen Abläufen 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 Python-Anwendung

Die Python-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.

Abbildung - Anwendungsfall 1: Benutzerauthentifizierung

Beschreibung von Abbildung - folgt
Beschreibung von "Abbildung - Anwendungsfall 1: Benutzerauthentifizierung"

Der Datenfluss geschieht auf folgende Weise:

  1. Der Benutzer fordert eine geschützte Ressource an.

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

  3. Der Webbrowser ruft die URL auf.

  4. Die Oracle Identity Cloud Service-Anmeldeseite wird angezeigt.

  5. Der Benutzer leitet seine Oracle Identity Cloud Service-Anmeldezugangsdaten weiter.

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

  7. Die Webanwendung führt einen Backend-Aufruf (oder Server-zu-Server-Aufruf) durch, um den Autorisierungscode für ein Benutzerzugriffstoken auszutauschen.

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

  9. Eine Session wird eingerichtet, und der Benutzer wird zur Homepage umgeleitet.

  10. Die Homepage der Webanwendung wird angezeigt.

Abbildung - Anwendungsfall 2: Benutzerdetails abrufen

Beschreibung von Abbildung - folgt
Beschreibung von "Abbildung - Anwendungsfall 2: Benutzerdetails abrufen"

Der Datenfluss geschieht auf folgende Weise:

  1. Der Benutzer fordert die Ressource /myProfile an.

  2. Die Webanwendung verwendet das SDK von Oracle Identity Cloud Service, um das ID-Token zu validieren.

  3. Die Daten, die von der ID-Tokenvalidierung zurückgegeben werden, enthalten Benutzerdetails im Format eines JSON-Objekts.

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

Informationen zu Methoden und Funktionen des Python-SDK

Das Python-SDK ist als zwei python-Dateien verfügbar, IdcsClient.py und Constants.py, die Sie in Ihre Webanwendung aufnehmen müssen.

Diese python-Dateien sind von Librarys von Drittanbietern abhängig, die ebenfalls in Ihrer Anwendung enthalten sein müssen. Um sie einzubeziehen, öffnen Sie die SDK-ZIP-Datei, extrahieren Sie die Dateien README.txt und requirements.txt in einen temporären Ordner, und führen Sie den Befehl pip install -r requirements.txt aus.

Eine Beispiel-Webanwendung wurde mit dem Python-Framework DJango entwickelt, das URL-Routen in Form von Funktionen implementiert.

Das Python-SDK erfordert eine JSON-Variable, die mit Oracle Identity Cloud Service-Verbindungsinformationen geladen ist. Die Python-Webanwendung verwendet eine config.json-Datei mit den folgenden Informationen.

{
   "ClientId" : "123456789abcdefghij",
   "ClientSecret" : "abcde-12345-zyxvu-98765-qwerty",
   "BaseUrl" : "https://idcs-abcd1234.identity.oraclecloud.com",
   "AudienceServiceUrl" : "https://idcs-abcd1234.identity.oraclecloud.com",  
   "scope" : "urn:opc:idm:t.user.me openid",
   "TokenIssuer" : "https://identity.oraclecloud.com/",
   "redirectURL": "http://localhost:8000/callback",
   "logoutSufix":"/oauth2/v1/userlogout",
   "LogLevel":"INFO",
   "ConsoleLog":"True" 
}

Im Folgenden finden Sie eine kurze Erläuterung der einzelnen erforderlichen Attribute für dieses SDK:

Tabelle - Erforderliche Attribute für das Python-SDK

Attributname Attributbeschreibung
ClientId Der Wert der Client-ID, die nach der Registrierung der Webanwendung mit der Oracle Identity Cloud Service-Konsole generiert wird.
ClientSecret Der Wert des Client Secrets, das generiert wird, nachdem Sie die Webanwendung mit der Oracle Identity Cloud Service-Konsole registriert haben.
BaseUrl Die Domain-URL Ihrer Oracle Identity Cloud Service-Instanz.
AdminServiceUrl Die Domainnamen-URL Ihrer Oracle Identity Cloud Service-Instanz. Dies ist in der Regel dasselbe wie BaseUrl.
TokenIssuer Behalten Sie den hier dargestellten Wert bei.
scope Der Geltungsbereich steuert die Daten, auf die die Anwendung im Namen des Benutzers zugreifen oder diese verarbeiten kann. Da die Anwendung das SDK zur Authentifizierung verwendet, lautet der Geltungsbereich openid. Die Anwendung implementiert auch den Anwendungsfall get user details, für den Sie auch den Geltungsbereich urn:opc:idm:t.user.me verwenden müssen.
ConsoleLog Aktiviert SDK-Log.
LogLevel Gibt die Logebene des SDK an.

Die Attribute logoutSufix und redirectURL werden beide von der Anwendung verwendet. Daher sind sie für das SDK nicht erforderlich.

Die Anwendung implementiert die Funktionsdefinition auth, mit der die URL /auth zugeordnet wird. Wenn sich ein Benutzer bei Oracle Identity Cloud Service authentifiziert, fordert der Browser diese URL an.

Die Funktion auth initialisiert den Authentication Manager, verwendet die JSON-Konfigurationsattribute als Parameter, verwendet das SDK, um die URL des Oracle Identity Cloud Service-Autorisierungscodes zu generieren, und leitet den Browser dann zu dieser URL um.

#Loading the SDK Python file.
from . import IdcsClient
 
#Function used to load the configurations from the config.json file
def getOptions():
    fo = open("config.json", "r")
    config = fo.read()
    options = json.loads(config)
    return options
 
# Definition of the /auth route
def auth(request):
    #Loading the configurations
    options = getOptions()
    print "config.json file = %s" % options
    #Authentication Manager loaded with the configurations.   
    am = IdcsClient.AuthenticationManager(options)
    #Using Authentication Manager to generate the Authorization Code URL, passing the 
    #application's callback URL as parameter, along with code value and code parameter.    
    url = am.getAuthorizationCodeUrl(options["redirectURL"], options["scope"], "1234", "code")
    #Redirecting the browser to the Oracle Identity Cloud Service Authorization URL.
    return HttpResponseRedirect(url)

Die folgenden Parameter werden zum Generieren der Autorisierungscode-URL verwendet:

Tabelle - Parameter zum Generieren der Autorisierungscode-URL

Parametername Parameterbeschreibung
options["redirectURL"] Nach erfolgreicher Anmeldung 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 Oracle Identity Cloud Service-Konsole konfigurieren.
options["scope"] Der Authentifizierungsgeltungsbereich OAuth oder OpenID Connect. Diese Anwendung erfordert nur die Authentifizierung openid.
state Die Webanwendung verwendet diesen Code, um zu prüfen, ob die Kommunikation mit Oracle Identity Cloud Service hergestellt werden kann. Der Parameter wird vom OAuth-Protokoll definiert.
response_type Der Wert, der für den Autorisierungscodezugriffsberechtigungstyp erforderlich ist (Beispiel: code).

Die Funktion callback verwendet den URL-Parameter des Autorisierungscodes, um ein Zugriffstoken und ein ID-Token anzufordern. Beide Token werden zur späteren Verwendung in der Benutzersession gespeichert.

# Definition of the /callback route
def callback(request):
   code = request.GET.get('code')
   #Authentication Manager loaded with the configurations.
   am = IdcsClient.AuthenticationManager(getOptions())
   #Using the Authentication Manager to exchange the Authorization Code to an Access Token.
   ar = am.authorizationCode(code)
   #Get the access token as a variable    
   access_token = ar.getAccessToken()    
   id_token = ar.getIdToken()

   #Validating id token to acquire information such as UserID, DisplayName, list of groups 
   #and AppRoles assigned to the user    
   id_token_verified = am.verifyIdToken(id_token)

   displayname = id_token_verified.getDisplayName()
   #The application then adds these information to the User Session.
   request.session['access_token'] = access_token
   request.session['id_token'] = id_token
   request.session['displayname'] = displayname
   #Rendering the home page and adding displayname to be printed in the page.
   return render(request,'sampleapp/home.html', {'displayname': displayname})

Die Funktion myProfile greift auf das ID-Token des Benutzers zu, ruft die Funktion AuthenticationManager verifyIdToken auf, um Benutzerinformationen wie den Namen, die Gruppen und die dem Benutzer zugewiesenen Anwendungen als JSON-Text abzurufen, und sendet die Informationen dann zur Wiedergabe an myProfile.html.

# Definition of the /myProfile route
def myProfile(request):
   #Getting the Access Token value from the session
   access_token = request.session.get('access_token', 'none')
   if access_token == 'none':
       #If the access token isn't present redirects to login page.
       return render(request, 'sampleapp/login.html')
   else:
       #If the access token is present, validates the id token to acquire
       #information such as UserID, DisplayName, list of groups and AppRoles assigned to the user.

       #Authentication Manager loaded with the configurations.
       am = IdcsClient.AuthenticationManager(getOptions())        
       id_token = request.session.get('id_token', 'none')
       id_token_verified = am.verifyIdToken(id_token)

       #Getting the user details in json format.        
       jsonProfile = id_token_verified.getIdToken()
       #Getting User information to send to the My Profile page.        
       displayname = request.session.get('displayname', 'displayname')

       #Redenring json to be used in the html page.
       json_pretty = json.dumps(jsonProfile, sort_keys=True, indent=2)        
       context = {
          'displayname': displayname,
          "json_pretty": json_pretty,
       }
       #Rendering the content of the My Profile Page.
       return render(request, 'sampleapp/myProfile.html', context)

Um den Benutzer von Single Sign-On zwischen der Anwendung und Oracle Identity Cloud Service abzumelden, implementiert die Python-Webanwendung die Funktion logout. Diese Funktion löscht die zuvor festgelegten Benutzersessionattribute und leitet den Benutzer dann zur Abmelde-URL OAuth von Oracle Identity Cloud Service um. Diese URL wird in der Datei config.json als Parameter logoutSufix eingerichtet.

# Definition of the /logout route
def logout(request):
   #Getting the Access Token value from the session
   access_token = request.session.get('access_token', 'none')
   if access_token == 'none':
        #If the access token isn't present redirects to login page.
        return render(request, 'sampleapp/login.html') 
   else:
       options = getOptions()        
       url = options["BaseUrl"]        
       url += options["logoutSufix"]        
       url += '?post_logout_redirect_uri=http%3A//localhost%3A8000&id_token_hint='        
       url += request.session.get('id_token', 'none')
       #Clear session attributes
       del request.session['access_token']
       del request.session['id_token']
       del request.session['displayname']
       #Redirect to Oracle Identity Cloud Service logout URL.
       return HttpResponseRedirect(url)