Más información sobre la autenticación entre aplicaciones Python y Oracle Identity Cloud Service

Ya puede obtener más información sobre la autenticación entre las aplicaciones web de Python y Oracle Identity Cloud Service. Esto incluye comprender lo siguiente:

  • Casos de uso para utilizar un SDK con una aplicación Python para autenticarse con Oracle Identity Cloud Service.

  • Flujo de autenticación de tres partes que soporta Oracle Identity Cloud Service para el SDK de Python

  • Métodos y funciones del SDK de Python

Más información sobre flujos de autenticación de tres segmentos

Oracle Identity Cloud Service soporta el flujo de autenticación de tres partes para el SDK de Python. En este flujo, los usuarios interactúan directamente con Oracle Identity Cloud Service. Después de que un usuario se conecte, Oracle Identity Cloud Service emite un código de autorización que el SDK intercambia para un token de acceso de usuario. La aplicación Python puede utilizar este token de acceso para otorgar a los usuarios acceso a los recursos protegidos de la aplicación. El flujo de tres partes utiliza el tipo de permiso de código de autorización.

Para aumentar la seguridad, Oracle recomienda utilizar flujos de tres partes para integrar las aplicaciones web de Python con Oracle Identity Cloud Service para la autenticación. Mediante el tipo de permiso de código de autorización, también puede acceder a otras aplicaciones protegidas por Oracle Identity Cloud Service sin tener que volver a autenticarse.

Información sobre los casos de uso principales para el uso de un SDK con una aplicación Python

La aplicación web de Python implementa dos casos de uso: uno para autenticar usuarios y el otro para acceder a información detallada sobre el usuario que está conectado.

Los siguientes diagramas de flujo de datos ilustran el flujo de eventos, llamadas y respuestas entre el explorador web, la aplicación web y Oracle Identity Cloud Service para cada caso de uso.

Figura - Caso de uso 1: Autenticación de usuario

A continuación, se muestra la descripción de la figura -
Descripción de "Figura - Caso de Uso 1: Autenticación de Usuario"

El flujo de datos se produce de esta forma:

  1. El usuario solicita un recurso protegido.

  2. El módulo de autenticación utiliza el SDK para generar una URL de solicitud-autorización-código para Oracle Identity Cloud Service y enviar esta URL como respuesta de redirección al explorador web.

  3. El explorador web llama a la URL.

  4. Aparece la página de conexión de Oracle Identity Cloud Service.

  5. El usuario envía sus credenciales de conexión de Oracle Identity Cloud Service.

  6. Una vez que el usuario se ha conectado correctamente, Oracle Identity Cloud Service crea una sesión para el usuario y emite un código de autorización.

  7. La aplicación web realiza una llamada de backend (o de servidor a servidor) para intercambiar el código de autorización para un token de acceso de usuario.

  8. Oracle Identity Cloud Service emite un token de acceso y un token de ID.

  9. Se establece una sesión y se redirige al usuario a la página de inicio.

  10. Aparece la página inicial de la aplicación web.

Figura - Caso de uso 2: Obtener detalles del usuario

A continuación, se muestra la descripción de la figura -
Descripción de "Figura - Caso de Uso 2: Obtener Detalles del Usuario"

El flujo de datos se produce de esta forma:

  1. El usuario solicita el recurso /myProfile.

  2. La aplicación web utiliza el SDK de Oracle Identity Cloud Service para validar el token de ID.

  3. Los datos que se devuelven de la validación del token de ID contienen los detalles del usuario con el formato de un objeto JSON.

  4. La página Mi perfil representa el objeto JSON como contenido HTML.

Más información sobre métodos y funciones del SDK de Python

El SDK de Python está disponible como dos archivos de python, IdcsClient.py y Constants.py, que debe incluir en la aplicación web.

Estos archivos de python dependen de bibliotecas de terceros que también se deben incluir en la aplicación. Para incluirlos, abra el archivo zip del SDK, extraiga los archivos README.txt y requirements.txt en una carpeta temporal y ejecute el comando pip install -r requirements.txt.

Se desarrolló una aplicación web de ejemplo mediante el marco DJango de Python, que implementa rutas URL en forma de funciones.

El SDK de Python necesita una variable JSON cargada con información de conexión de Oracle Identity Cloud Service. La aplicación web de Python utiliza un archivo config.json que proporciona la siguiente información.

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

A continuación se muestra una breve explicación de cada atributo necesario para este SDK:

Tabla - Atributos necesarios para el SDK de Python

Nombre del atributo Descripción del Atributo
ClientId Valor del ID de cliente que se genera después de registrar la aplicación web mediante la consola de Oracle Identity Cloud Service.
ClientSecret Valor del secreto de cliente que se genera después de registrar la aplicación web mediante la consola de Oracle Identity Cloud Service.
BaseUrl URL de dominio de la instancia de Oracle Identity Cloud Service.
AdminServiceUrl URL de nombre de dominio de la instancia de Oracle Identity Cloud Service. Normalmente es lo mismo que BaseUrl.
TokenIssuer Mantenga el valor como se presenta aquí.
scope El ámbito controla los datos a los que la aplicación puede acceder o procesar en nombre del usuario. Debido a que la aplicación utiliza el SDK para la autenticación, el ámbito es openid. La aplicación también implanta el caso de uso get user details, para el que también debe utilizar el ámbito urn:opc:idm:t.user.me.
ConsoleLog Activa el log del SDK.
LogLevel Indica el nivel de log del SDK.

La aplicación utiliza los atributos logoutSufix y redirectURL. Por lo tanto, no son necesarios para el SDK.

La aplicación implanta la definición de función auth, que asigna la URL /auth. Cuando un usuario se autentica con Oracle Identity Cloud Service, el explorador realiza una solicitud a esta URL.

La función auth inicializa el gestor de autenticación, utiliza los atributos de configuración de JSON como parámetros, utiliza el SDK para generar la URL de código de autorización de Oracle Identity Cloud Service y, a continuación, redirige el explorador a esta 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)

Se utilizan los siguientes parámetros para generar la URL del código de autorización:

Tabla: parámetros utilizados para generar la URL del código de autorización

Nombre de parámetro Descripción del Parámetro
options["redirectURL"] Después de conectarse correctamente, Oracle Identity Cloud Service redirige el explorador web del usuario a esta URL. Esta URL debe coincidir con la que configurará para la aplicación de confianza en la consola de Oracle Identity Cloud Service.
options["scope"] Ámbito de autenticación de OAuth o OpenID Connect. Esta aplicación solo necesita autenticación openid.
state La aplicación web utiliza este código para comprobar si se puede establecer la comunicación con Oracle Identity Cloud Service. El parámetro se define mediante el protocolo OAuth.
response_type Valor requerido por el tipo de permiso de código de autorización (por ejemplo, code).

La función callback utiliza el parámetro de URL de código de autorización para solicitar un token de acceso y un token de ID. Ambos tokens se almacenan en la sesión de usuario para su uso futuro.

# 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 función myProfile accede al token de ID del usuario, llama a la función AuthenticationManager verifyIdToken para recuperar la información del usuario, como el nombre, los grupos y las aplicaciones asignados al usuario, como texto JSON y, a continuación, envía la información a myProfile.html para la representación.

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

Para desconectar al usuario de la conexión única entre la aplicación y Oracle Identity Cloud Service, la aplicación web de Python implanta la función logout. Esta función borra los atributos de sesión de usuario definidos anteriormente y, a continuación, redirige al usuario a la URL de desconexión OAuth de Oracle Identity Cloud Service. Esta URL se configura en el archivo config.json como el parámetro 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)