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

Vous êtes prêt à vous familiariser avec l'authentification entre les applications Web Python et Oracle Identity Cloud Service. Cela comprend les différences suivantes :

  • Utilisez des cas pour utiliser un SDK avec une application Python afin de s'authentifier auprès de Oracle Identity Cloud Service.

  • Flux d'authentification à trois facteurs pris en charge par Oracle Identity Cloud Service pour le SDK Python

  • Méthodes et fonctions du SDK Python

En savoir plus sur les flux d'authentification 3D

Oracle Identity Cloud Service prend en charge le flux d'authentification à trois segments pour le 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 le 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 un accès aux ressources protégées de l'application. Le flux à trois facteurs utilise le type d'octroi de code d'autorisation.

Pour une sécurité accrue, Oracle recommande d'utiliser des flux à trois facteurs 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 authentifier à nouveau.

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

L'application Web Python implémente deux cas d'emploi : l'un pour authentifier les utilisateurs et l'autre pour accéder aux 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'emploi 1 : authentification utilisateur

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

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

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

  2. Le module d'authentification utilise le kit SDK pour générer une URL request-authorization-code pour Oracle Identity Cloud Service et envoyer cette URL en tant que réponse de réacheminement au navigateur Web.

  3. Le navigateur Web appelle l'URL.

  4. La page 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 lui et émet un code d'autorisation.

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

  8. Oracle Identity Cloud Service émet le jeton d'accès.

  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'emploi 2 : obtenir les détails utilisateur

Description de la figure -
Description de l'image - Cas d'emploi 2 : obtenir les détails utilisateur

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

  1. L'utilisateur demande la ressource /myProfile.

  2. L'application Web appelle Oracle Identity Cloud Service à l'aide du kit SDK, qui utilise le jeton d'accès stocké dans la session utilisateur comme paramètre.

  3. Les détails de l'utilisateur sont envoyés à l'application Web en tant qu'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 SDK Python

Le 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, exécutez les commandes pip install suivantes :

pip install simplejson==3.13.2
pip install cryptography==2.1.4
pip install PyJWT==1.5.2
pip install requests==2.18.4
pip install six==1.10.0
pip install py3_lru_cache==0.1.6

Cette application Web échantillon a été développée à l'aide de la structure Python DJango, qui implémente des acheminements d'URL sous forme de fonctions.

Le SDK Python requiert 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.

//Oracle Identity Cloud Service connection parameters as a json var
{
   "ClientId" : "clientid",
   "ClientSecret" : "clientsecret",
   "BaseUrl" : "https://idcs-1234.identity.oraclecloud.com",
   "AudienceServiceUrl" : "https://idcs-1234.identity.oraclecloud.com",
   "TokenIssuer" : "https://identity.oraclecloud.com",
   "scope" : "urn:opc:idm:t.user.me openid",
   "redirectURL": "http://localhost:8000/callback",
   "logoutSufix":"/oauth2/v1/userlogout"
}

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

Tableau - Attributs obligatoires pour le SDK Python

Nom d'attribut Description de l'attribut
ClientId Valeur de l'ID client généré après 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'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 de nom de domaine de votre instance Oracle Identity Cloud Service. Généralement identique à BaseUrl.
TokenIssuer Conservez la valeur comme indiqué ici.
scope La portée contrôle les données auxquelles l'application peut accéder ou traiter pour le compte de l'utilisateur. Comme 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.

Les attributs logoutSufix et redirectURL sont utilisés par l'application. Par conséquent, ils ne sont pas requis par le kit 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 de 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 comme paramètres, utilise le kit 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()
    #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 permettent de générer l'URL de code d'autorisation :

Tableau - Paramètres utilisés pour générer l'URL de 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 configurerez pour l'application sécurisée dans la console Oracle Identity Cloud Service.
options["scope"] Portée d'authentification de OAuth ou de OpenID. 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. Ce 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. Le jeton d'accès est stocké en tant que cookie, qui est ensuite envoyé au navigateur 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()
   #User Manager loaded with the configurations.
   um = IdcsClient.UserManager(getOptions())
   #Using the access_token value to get an object instance representing the User Profile.
   u = um.getAuthenticatedUser(access_token)
   #Getting the user details in json object format.
   displayname = u.getDisplayName()
   #The application then adds these information to the User Session.
   request.session['access_token'] = access_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'accès de l'utilisateur, appelle la fonction getAuthenticatedUser pour extraire les informations de l'utilisateur sous forme de 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, then loads the User Manager with the configurations.
       am = IdcsClient.UserManager(getOptions())
       #Using the access_token value to get an object instance representing the User Profile.
       u = am.getAuthenticatedUser(access_token)
       #Getting the user details in json format.
       jsonProfile = json.dumps(u.getUser())
       #Getting User information to send to the My Profile page.
       displayname = request.session.get('displayname', 'displayname')
       #Rendering the content of the My Profile Page.
       return render(request, 'sampleapp/myProfile.html', {'displayname': displayname, 'jsonProfile':jsonProfile})

Pour déconnecter l'utilisateur d'un accès avec connexion unique (SSO) entre l'application et Oracle Identity Cloud Service, l'application Web Python implémente la fonction logout. Cette fonction invalide la session utilisateur, puis redirige l'utilisateur vers l'URL de déconnexion OAuth de 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):
    options = getOptions()
    url = options["BaseUrl"]
    url += options["logoutSufix"]
    del request.session['access_token']
    del request.session['displayname']
    return HttpResponseRedirect(url)