Información sobre la autenticación entre aplicaciones Python y Oracle Identity Cloud Service

Está listo para obtener información sobre la autenticación entre las aplicaciones web Python y Oracle Identity Cloud Service. Esto incluye la descripción de 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 plataformas que soporta Oracle Identity Cloud Service para el SDK de Python

  • Métodos y funciones del SDK de Python

Obtener Más Información sobre Flujos de Autenticación Tramitados

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 conectarse un usuario, Oracle Identity Cloud Service emite un código de autorización que intercambia el SDK 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 en la aplicación. El flujo trilegado utiliza el tipo de permiso de código de autorización.

Para mayor seguridad, Oracle recomienda utilizar tres flujos para integrar las aplicaciones web 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.

Obtenga información sobre los casos de uso principales para utilizar un SDK con una aplicación Python

La aplicación web Python implementa dos casos de uso: uno para autenticar a los usuarios y otro para acceder a información detallada sobre el usuario 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 código de solicitud para Oracle Identity Cloud Service y enviar esta URL como respuesta de redireccionamiento al explorador Web.

  3. El explorador web llama a la URL.

  4. Aparece la página de inicio de sesió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 inicia sesión 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 backend (o de servidor a servidor) para intercambiar el código de autorización de un token de acceso de usuario.

  8. Oracle Identity Cloud Service emite el token de acceso.

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

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

Figura: Caso de Uso 2: Obtener Detalles de Usuario

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

El flujo de datos se produce de esta forma:

  1. El usuario solicita el recurso /myProfile.

  2. La aplicación web llama a Oracle Identity Cloud Service con el SDK, que utiliza el token de acceso almacenado en la sesión de usuario como parámetro.

  3. Los detalles del usuario se envían a la aplicación web como objeto JSON.

  4. La página Mi Perfil presenta el objeto JSON como contenido HTML.

Información sobre métodos y funciones del SDK de Python

SDK de Python está disponible como dos archivos python, IdcsClient.py y Constants.py, que debe incluir en su aplicación web. Estos archivos python dependen de bibliotecas de terceros que también deben incluirse en la aplicación. Para incluirlos, ejecute los siguientes comandos de pip install:

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

Esta aplicación web de ejemplo se ha desarrollado mediante la estructura DJango de Python, que implanta rutas de URL en forma de funciones.

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

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

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 de 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 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 del nombre de dominio de la instancia de Oracle Identity Cloud Service. Normalmente es lo mismo que BaseUrl.
TokenIssuer Mantenga el valor como se muestra aquí.
scope El ámbito controla los datos a los que la aplicación puede acceder o procesar en nombre del usuario. Puesto que la aplicación utiliza el SDK para la autenticación, el ámbito es openid. La aplicación también implementa el caso de uso de get user details, para el que también debe utilizar el ámbito urn:opc:idm:t.user.me.

Tanto los atributos logoutSufix como redirectURL son utilizados por la aplicación. Por lo tanto, el SDK no los necesita.

La aplicación implementa la definición de la función auth, que asigna la URL de /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()
    #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)

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

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

Nombre del Parámetro Descripción del Parámetro
options["redirectURL"] Una vez conectado correctamente, Oracle Identity Cloud Service redirecciona 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 u OpenID Connect. Esta aplicación sólo necesita autenticación de openid.
state La aplicación web utiliza este código para comprobar si la comunicación se puede establecer con Oracle Identity Cloud Service. El parámetro lo define el protocolo OAuth.
response_type Valor necesario para 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. El token de acceso se almacena como cookie, que luego se envía al explorador para su uso posterior.

# 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 función myProfile accede al token de acceso del usuario, llama a la función getAuthenticatedUser para recuperar la información del usuario como texto JSON y, a continuación, envía la información a myProfile.html para su presentació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, 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})

Para cerrar la sesión de un inicio de sesión único entre la aplicación y Oracle Identity Cloud Service, la aplicación web Python implementa la función logout. Esta función invalida la sesión del usuario y, a continuación, redirige al usuario a la URL de desconexión de 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):
    options = getOptions()
    url = options["BaseUrl"]
    url += options["logoutSufix"]
    del request.session['access_token']
    del request.session['displayname']
    return HttpResponseRedirect(url)