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 inclut la compréhension des éléments suivants :

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

  • Flux d'authentification à trois éléments pris en charge par Oracle Identity Cloud Service pour le kit SDK Python

  • Méthodes et fonctions du kit SDK Python

En savoir plus sur les flux d'authentification à trois éléments

Oracle Identity Cloud Service prend en charge le flux d'authentification à trois éléments pour le kit SDK Python. Dans ce flux, les utilisateurs interagissent directement avec Oracle Identity Cloud Service. Une fois qu'un utilisateur se connecte, Oracle Identity Cloud Service émet un code d'autorisation que le kit SDK échange pour un jeton d'accès 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 de l'application. Le flux à trois pattes utilise le type d'octroi de code d'autorisation.

Pour une sécurité accrue, Oracle recommande d'utiliser des flux à trois éléments afin d'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'un kit SDK avec une application Python

L'application Web Python implémente 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'emploi.

Figure - Cas d'utilisation 1 : Authentification utilisateur

Description de la figure -
Description de la figure Cas d'utilisation 1 : authentification de l'utilisateur

Le flux de données se produit de cette manière :

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

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

  3. Le navigateur Web appelle l'URL.

  4. La page de connexion à Oracle Identity Cloud Service apparaît.

  5. L'utilisateur soumet ses informations 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 back-end (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 apparaît.

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

Description de la figure -
Description de la figure Cas d'utilisation 2 : obtention des détails utilisateur

Le flux de données se produit de cette manière :

  1. L'utilisateur demande la ressource /myProfile.

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

  3. Les données renvoyées par la validation de jeton d'ID contiennent les détails de l'utilisateur au 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 du kit SDK Python

Le kit SDK Python est disponible sous la forme de 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 kit 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 de la structure Python DJango, qui implémente des routages d'URL sous forme de fonctions.

Le kit 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" 
}

Voici une brève explication de chaque attribut requis pour ce kit SDK :

Table - Attributs requis pour le kit SDK Python

Nom d'attribut Description de l'attribut
ClientId Valeur de l'ID client généré après l'inscription 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'inscription de l'application Web à l'aide de la console Oracle Identity Cloud Service.
BaseUrl URL de domaine de l'instance Oracle Identity Cloud Service.
AdminServiceUrl URL de nom de domaine de l'instance Oracle Identity Cloud Service. Il est généralement identique à BaseUrl.
TokenIssuer Conservez la valeur telle que présentée ici.
scope La portée contrôle les données auxquelles l'application peut accéder ou traiter pour le compte de l'utilisateur. Etant donné que l'application utilise le kit SDK pour l'authentification, la portée est openid. L'application implémente également le cas d'emploi get user details, pour lequel vous devez également utiliser la portée urn:opc:idm:t.user.me.
ConsoleLog Active le journal SDK.
LogLevel Indique le niveau de journalisation du kit SDK.

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

L'application implémente la définition de fonction auth, qui met en correspondance 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 le kit SDK pour générer l'URL de 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 de 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 sécurisée dans la console Oracle Identity Cloud Service.
options["scope"] Portée d'authentification OAuth ou OpenID Connect. Cette application requiert 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 du 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 ultérieure.

# 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 de l'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 affichage.

# 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'accès avec connexion unique entre l'application et Oracle Identity Cloud Service, l'application Web Python implémente la fonction logout. Cette fonction efface les attributs de session utilisateur définis précédemment, puis redirige l'utilisateur vers l'URL de déconnexion OAuth d'Oracle Identity Cloud Service. 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)