Informazioni sull'autenticazione tra applicazioni Python e Oracle Identity Cloud Service

Puoi ottenere informazioni sull'autenticazione tra le applicazioni Web Python e Oracle Identity Cloud Service. Ciò include quanto riportato di seguito.

  • Utilizza casi per utilizzare un SDK con un'applicazione Python per eseguire l'autenticazione con Oracle Identity Cloud Service.

  • Flusso di autenticazione a tre fasi supportato da Oracle Identity Cloud Service per l'SDK Python

  • Metodi e funzioni del kit SDK Python

Informazioni sui flussi di autenticazione tridimensionali

Oracle Identity Cloud Service supporta il flusso di autenticazione a tre fasi per l'SDK Python. In questo flusso gli utenti interagiscono direttamente con Oracle Identity Cloud Service. Dopo che un utente si collega, Oracle Identity Cloud Service emette un codice di autorizzazione che viene scambiato da un token di accesso utente. Questo token di accesso può essere utilizzato dall'applicazione Python per concedere agli utenti l'accesso alle risorse protette nell'applicazione. Il flusso a tre fasi utilizza il tipo di autorizzazione codice autorizzazione.

Per una maggiore sicurezza, Oracle consiglia di usare flussi a tre fasi per integrare le applicazioni Web Python con Oracle Identity Cloud Service per l'autenticazione. Utilizzando il tipo di concessione del codice autorizzazione, è inoltre possibile accedere ad altre applicazioni protette da Oracle Identity Cloud Service senza dover ripetere l'autenticazione.

Informazioni sui casi d'uso principali per l'utilizzo di un SDK con un'applicazione Python

L'applicazione Web Python implementa due casi d'uso: uno per autenticare gli utenti e l'altro per accedere a informazioni dettagliate sull'utente che ha eseguito il login.

I diagrammi di flusso di dati seguenti illustrano il flusso di eventi, chiamate e risposte tra il browser Web, l'applicazione Web e Oracle Identity Cloud Service per ogni caso d'uso.

Figura: Caso d'uso 1: Autenticazione utente

Segue la descrizione della Figura -
Descrizione della "Figura - Caso d'uso 1: Autenticazione utente"

Il flusso di dati viene eseguito in questo modo:

  1. L'utente richiede una risorsa protetta.

  2. Il modulo di autenticazione utilizza l'SDK per generare l'URL del codice di richiesta per Oracle Identity Cloud Service e inviare questo URL come risposta di reindirizzamento al browser Web.

  3. Il browser Web chiama l'URL.

  4. Viene visualizzata la pagina Collegamento di Oracle Identity Cloud Service.

  5. L'utente sottomette le credenziali di accesso a Oracle Identity Cloud Service.

  6. Una volta completato il login, Oracle Identity Cloud Service crea una sessione per l'utente ed emette un codice di autorizzazione.

  7. L'applicazione Web effettua una chiamata backend (o da server a server) per scambiare il codice di autorizzazione per un token di accesso utente.

  8. Oracle Identity Cloud Service emette il token di accesso.

  9. Viene stabilita una sessione e l'utente viene reindirizzato alla home page.

  10. Viene visualizzata la home page dell'applicazione Web.

Figura: Caso d'uso 2: recupero dei dettagli utente

Segue la descrizione della Figura -
Descrizione della "Figura: Caso d'uso 2: recupero dei dettagli utente"

Il flusso di dati viene eseguito in questo modo:

  1. L'utente richiede la risorsa /myProfile.

  2. L'applicazione Web chiama Oracle Identity Cloud Service mediante SDK, che utilizza il token di accesso memorizzato nella sessione utente come parametro.

  3. I dettagli dell'utente vengono inviati all'applicazione Web come oggetto JSON.

  4. La pagina Profilo personale presenta l'oggetto JSON come contenuto HTML.

Informazioni sui metodi e sulle funzioni dell'SDK Python

L'SDK Python è disponibile come due file python, IdcsClient.py e Constants.py, che è necessario includere nell'applicazione Web. Questi file python dipendono da librerie di terze parti che devono essere incluse anche nell'applicazione. Per includerli, eseguire i comandi pip install riportati di seguito.

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

Questa applicazione Web di esempio è stata sviluppata mediante la struttura Python DJango, che implementa gli instradamenti URL sotto forma di funzioni.

L'SDK Python richiede una variabile JSON caricata con le informazioni di connessione a Oracle Identity Cloud Service. L'applicazione Web Python utilizza un file config.json che fornisce le seguenti informazioni.

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

Di seguito è riportata una breve spiegazione di ogni attributo richiesto per questo SDK:

Tabella - Attributi richiesti per l'SDK Python

Nome attributo Descrizione attributo
ClientId Il valore dell'ID client generato dopo la registrazione dell'applicazione Web mediante la console Oracle Identity Cloud Service.
ClientSecret Il valore del segreto client generato dopo la registrazione dell'applicazione Web mediante la console Oracle Identity Cloud Service.
BaseUrl L'URL del dominio dell'istanza di Oracle Identity Cloud Service.
AdminServiceUrl L'URL del nome dominio dell'istanza di Oracle Identity Cloud Service. Si tratta in genere dello stesso nome di BaseUrl.
TokenIssuer Mantenere il valore visualizzato qui.
scope L'ambito controlla i dati ai quali l'applicazione può accedere o elaborare per conto dell'utente. Poiché l'applicazione utilizza l'SDK per l'autenticazione, l'ambito è openid. L'applicazione implementa inoltre il caso d'uso di get user details, per il quale è necessario utilizzare anche l 'urn:opc:idm:t.user.me di ambito.

Gli attributi logoutSufix e redirectURL sono entrambi utilizzati dall'applicazione. Pertanto, non sono richiesti dall'SDK.

L'applicazione implementa la definizione della funzione auth, che mappa l'URL di /auth. Quando un utente effettua l'autenticazione con Oracle Identity Cloud Service, il browser invia una richiesta a questo URL.

La funzione auth inizializza Authentication Manager, utilizza gli attributi di configurazione JSON come parametri, utilizza SDK per generare l'URL del codice di autorizzazione Oracle Identity Cloud Service e quindi reindirizza il browser a questo 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)

I seguenti parametri vengono utilizzati per generare l'URL del codice di autorizzazione:

Tabella: parametri utilizzati per generare l'URL del codice di autorizzazione

Nome parametro Descrizione parametro
options["redirectURL"] Dopo aver eseguito l'accesso, Oracle Identity Cloud Service reindirizza il browser Web dell'utente a questo URL. Questo URL deve corrispondere a quello che verrà configurato per l'applicazione protetta nella console di Oracle Identity Cloud Service.
options["scope"] L'ambito di autenticazione OAuth o OpenID Connect. Questa applicazione richiede solo l'autenticazione openid.
state L'applicazione Web utilizza questo codice per verificare se è possibile stabilire la comunicazione con Oracle Identity Cloud Service. Il parametro viene definito dal protocollo OAuth.
response_type Valore richiesto dal tipo di concessione del codice di autorizzazione (ad esempio, code).

La funzione callback utilizza il parametro URL del codice di autorizzazione per richiedere un token di accesso. Il token di accesso viene memorizzato come cookie e quindi inviato al browser per 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()
   #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 funzione myProfile accede al token di accesso dell'utente, chiama la funzione getAuthenticatedUser per recuperare le informazioni dell'utente sotto forma di testo JSON e quindi invia le informazioni a myProfile.html per la visualizzazione.

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

Per disconnettere l'utente da Single Sign-On tra l'applicazione e Oracle Identity Cloud Service, l'applicazione Web Python implementa la funzione logout. Questa funzione invalida la sessione utente e reindirizza l'utente all'URL di logout OAuth di Oracle Identity Cloud Service. Questo URL è impostato nel file config.json come parametro 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)