En savoir plus sur l'authentification entre les applications Python et Oracle Identity Cloud Service

Vous êtes prêt à en savoir plus sur l'authentification entre les applications Web Python et Oracle Identity Cloud Service. Cela comprend les éléments suivants :

  • Cas d'utilisation pour l'utilisation d'une trousse SDK avec une application Python pour l'authentification avec Oracle Identity Cloud Service.

  • Flux d'authentification à trois branches pris en charge par Oracle Identity Cloud Service pour la trousse SDK Python

  • Méthodes et fonctions de la trousse SDK Python

En savoir plus sur les flux d'authentification à trois branches

Oracle Identity Cloud Service prend en charge le flux d'authentification à trois branches pour la trousse SDK Python. 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 la trousse SDK échange pour un jeton d'accès d'utilisateur. Ce jeton d'accès peut être utilisé par l'application Python pour accorder aux utilisateurs l'accès aux ressources protégées dans l'application. Le flux à trois parties utilise le type d'octroi de code d'autorisation.

Pour une sécurité accrue, Oracle recommande d'utiliser des flux à trois branches pour intégrer vos applications Web Python à 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 réauthentifier.

En savoir plus sur les cas d'utilisation principaux pour l'utilisation d'une trousse SDK avec une application Python

L'application Web Python met en oeuvre deux cas d'utilisation : l'un pour authentifier les utilisateurs et l'autre pour accéder à des 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'utilisation.

Figure - Cas d'utilisation 1 : Authentification de l'utilisateur

Description de la figure - :
Description de "Figure - Cas d'utilisation 1 : Authentification de l'utilisateur"

Le flux de données se déroule de la façon suivante :

  1. L'utilisateur demande une ressource protégée.

  2. Le module d'authentification utilise la trousse SDK pour générer une URL de code d'autorisation de demande pour Oracle Identity Cloud Service et l'envoyer en tant que réponse de redirection au navigateur Web.

  3. Le navigateur Web appelle l'URL.

  4. La page de connexion à Oracle Identity Cloud Service s'affiche.

  5. L'utilisateur soumet ses données d'identification de connexion à Oracle Identity Cloud Service.

  6. Une fois l'utilisateur connecté, Oracle Identity Cloud Service crée une session pour l'utilisateur et émet un code d'autorisation.

  7. L'application Web effectue un appel dorsal (ou serveur à serveur) pour échanger le code d'autorisation contre un jeton d'accès utilisateur.

  8. Oracle Identity Cloud Service émet un jeton d'accès et un jeton d'ID.

  9. Une session est établie et l'utilisateur est redirigé vers la page d'accueil.

  10. La page d'accueil de l'application Web s'affiche.

Figure - Cas d'utilisation 2 : Obtenir les détails de l'utilisateur

Description de la figure - :
Description de "Figure - Cas d'utilisation 2 : Obtenir les détails de l'utilisateur"

Le flux de données se déroule de la façon suivante :

  1. L'utilisateur demande la ressource /myProfile.

  2. L'application Web utilise la trousse SDK d'Oracle Identity Cloud Service pour valider le jeton d'ID.

  3. Les données retournées à partir de la validation du jeton d'ID contiennent les détails de l'utilisateur dans le format d'un objet JSON.

  4. La page Mon profil affiche l'objet JSON en tant que contenu HTML.

En savoir plus sur les méthodes et les fonctions de la trousse SDK Python

La trousse SDK Python est disponible en tant que deux fichiers python, IdcsClient.py et Constants.py, que vous devez inclure dans votre application Web.

Ces fichiers python dépendent de bibliothèques tierces qui doivent également être incluses dans votre application. Pour les inclure, ouvrez le fichier zip de la trousse SDK, extrayez les fichiers README.txt et requirements.txt dans un dossier temporaire et exécutez la commande pip install -r requirements.txt.

Un exemple d'application Web a été développé à l'aide du cadre Python DJango, qui met en oeuvre des routes d'URL sous forme de fonctions.

La trousse SDK Python nécessite une variable JSON chargée avec les informations de connexion à Oracle Identity Cloud Service. L'application Web Python utilise un fichier config.json qui fournit les informations suivantes.

{
   "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" 
}

Vous trouverez ci-dessous une brève explication de chaque attribut requis pour cette trousse SDK :

Tableau - Attributs requis pour la trousse SDK Python

Nom d'attribut Description de l'attribut
ClientId Valeur de l'ID client généré après l'enregistrement de l'application Web à l'aide de la console Oracle Identity Cloud Service.
ClientSecret Valeur de la clé secrète client générée après l'enregistrement de l'application Web à l'aide de la console Oracle Identity Cloud Service.
BaseUrl URL de domaine de votre instance Oracle Identity Cloud Service.
AdminServiceUrl URL du nom de domaine de votre instance Oracle Identity Cloud Service. C'est généralement la même chose que BaseUrl.
TokenIssuer Conservez la valeur telle qu'elle est présentée ici.
scope La portée contrôle les données auxquelles l'application peut accéder ou traiter au nom de l'utilisateur. Comme l'application utilise la trousse SDK pour l'authentification, la portée est openid. L'application met également en oeuvre le cas d'utilisation get user details, pour lequel vous devez également utiliser la portée urn:opc:idm:t.user.me.
ConsoleLog Active le journal de la trousse SDK.
LogLevel Indique le niveau de journal de la trousse SDK.

Les attributs logoutSufix et redirectURL sont tous deux utilisés par l'application. Par conséquent, ils ne sont pas requis par le SDK.

L'application met en oeuvre la définition de fonction auth, qui mappe l'URL /auth. Lorsqu'un utilisateur s'authentifie auprès d'Oracle Identity Cloud Service, le navigateur envoie une demande à cette URL.

La fonction auth initialise le gestionnaire d'authentification, utilise les attributs de configuration JSON en tant que paramètres, utilise la trousse SDK pour générer l'URL du code d'autorisation Oracle Identity Cloud Service, puis redirige le navigateur vers cette URL.

#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)

Les paramètres suivants sont utilisés pour générer l'URL du code d'autorisation :

Table - Paramètres utilisés pour générer l'URL du code d'autorisation

Nom du paramètre Description du paramètre
options["redirectURL"] Une fois la connexion établie, Oracle Identity Cloud Service redirige le navigateur Web de l'utilisateur vers cette URL. Cette URL doit correspondre à celle que vous allez configurer pour l'application approuvée dans la console Oracle Identity Cloud Service.
options["scope"] Portée d'authentification OAuth ou OpenID Connect. Cette application nécessite uniquement l'authentification openid.
state L'application Web utilise ce code pour vérifier si la communication peut être établie avec Oracle Identity Cloud Service. Le paramètre est défini par le protocole OAuth.
response_type Valeur requise par le type d'octroi de code d'autorisation (par exemple, code).

La fonction callback utilise le paramètre d'URL de code d'autorisation pour demander un jeton d'accès et un jeton d'ID. Les deux jetons sont stockés dans la session utilisateur pour une utilisation future.

# 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})

La fonction myProfile accède au jeton d'ID utilisateur, appelle la fonction AuthenticationManager verifyIdToken pour extraire les informations de l'utilisateur telles que le nom, les groupes et les applications affectés à l'utilisateur, en tant que texte JSON, puis envoie les informations à myProfile.html pour le rendu.

# 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)

Pour déconnecter l'utilisateur de l'authentification unique entre l'application et Oracle Identity Cloud Service, l'application Web Python met en oeuvre la fonction logout. Cette fonction efface les attributs de session d'utilisateur définis précédemment, puis redirige l'utilisateur vers l'URL de déconnexion d'Oracle Identity Cloud Service OAuth. Cette URL est configurée dans le fichier config.json en tant que paramètre logoutSufix.

# 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)