Saiba Mais sobre Autenticação entre Aplicativos Python e Oracle Identity Cloud Service

Você está pronto para aprender sobre a autenticação entre aplicativos Web Python e o Oracle Identity Cloud Service. Isso inclui compreender o seguinte:

  • Use casos para usar um SDK com um aplicativo Python para autenticação no Oracle Identity Cloud Service.

  • O fluxo de autenticação três trechos suportado pelo Oracle Identity Cloud Service para o Python SDK

  • Métodos e funções do SDK Python

Saiba Mais sobre Fluxos de Autenticação com Trecho

O Oracle Identity Cloud Service suporta o fluxo de autenticação com três partes para o Python SDK. Neste fluxo, os usuários interagem diretamente com o Oracle Identity Cloud Service. Depois que um usuário acessa, o Oracle Identity Cloud Service emite um código de autorização que o SDK troque para um token de acesso do usuário. Esse token de acesso pode ser usado pelo aplicativo Python para conceder aos usuários acesso aos recursos protegidos no aplicativo. O fluxo três trechos usa o tipo de concessão de código de autorização.

Para aumentar a segurança, a Oracle recomenda que você use fluxos com três partes para integrar seus aplicativos Python Web com o Oracle Identity Cloud Service para autenticação. Usando o tipo de concessão de código de autorização, você também pode acessar outras aplicações protegidas pelo Oracle Identity Cloud Service sem precisar reautenticar.

Saiba Mais Sobre os Casos de Uso Principais para Usar um SDK com um Aplicativo Python

O aplicativo Web Python implementa dois casos de uso: um para autenticar usuários e outro para acessar informações detalhadas sobre o usuário que está conectado.

Os diagramas de fluxo de dados a seguir ilustram o fluxo de eventos, chamadas e respostas entre o navegador da Web, o aplicativo da Web e o Oracle Identity Cloud Service para cada caso de uso.

Figura - Caso de Uso 1: Autenticação do Usuário

A descrição da Figura - é exibida a seguir
Descrição da "Figura - Caso de Uso 1: Autenticação do Usuário"

O fluxo de dados acontece desta forma:

  1. O usuário solicita um recurso protegido.

  2. O módulo de autenticação usa o SDK para gerar um URL de código de atributos da solicitação para o Oracle Identity Cloud Service e enviar este URL como uma resposta de redirecionamento ao web browser.

  3. O Web browser chama o URL.

  4. A página de Sign-In do Oracle Identity Cloud Service é exibida.

  5. O usuário submete suas credenciais de sign-in no Oracle Identity Cloud Service.

  6. Após o log-in do usuário com sucesso, o Oracle Identity Cloud Service cria uma sessão para o usuário e emite um código de autorização.

  7. O aplicativo Web faz uma chamada de back-end (ou servidor para servidor) para trocar o código de autorização para um token de acesso do usuário.

  8. O Oracle Identity Cloud Service emite o token de acesso.

  9. Uma sessão é estabelecida e o usuário é redirecionado para a Home page.

  10. A Home page da aplicação Web será exibida.

Figura - Caso de Uso 2: Obter Detalhes do Usuário

A descrição da Figura - é exibida a seguir
Descrição da "Figura - Caso de Uso 2: Obter Detalhes do Usuário"

O fluxo de dados acontece desta forma:

  1. O usuário solicita o recurso /myProfile.

  2. O aplicativo Web chama o Oracle Identity Cloud Service usando o SDK, que usa o token de acesso armazenado na sessão do usuário como um parâmetro.

  3. Os detalhes do usuário são enviados para a aplicação Web como um objeto JSON.

  4. A página Meu Perfil converte o objeto JSON como conteúdo HTML.

Saiba Mais sobre Métodos e Funções do SDK Python

O Python SDK está disponível como dois arquivos python, IdcsClient.py e Constants.py, que você deve incluir em seu aplicativo Web. Esses arquivos python dependem de bibliotecas de terceiros que também devem ser incluídos no seu aplicativo. Para incluí-los, execute os seguintes comandos 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

Este aplicativo Web de amostra foi desenvolvido usando a estrutura DJango Python, que implementa rotas de URL na forma de funções.

O SDK Python requer uma variável JSON que é carregada com informações de conexão do Oracle Identity Cloud Service. O aplicativo Web Python usa um arquivo config.json que fornece as seguintes informações.

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

Veja abaixo uma breve explicação de cada atributo necessário para este SDK:

Tabela - Atributos Obrigatórios para o SDK Python

Nome do Atributo Descrição do Atributo
ClientId O valor do ID do cliente gerado após você registrar a aplicação Web usando a console do Oracle Identity Cloud Service.
ClientSecret O valor do segredo do cliente gerado após você registrar a aplicação Web usando a console do Oracle Identity Cloud Service.
BaseUrl O URL do domínio da instância do Oracle Identity Cloud Service.
AdminServiceUrl O URL do nome do domínio da sua instância do Oracle Identity Cloud Service. Geralmente é igual a BaseUrl.
TokenIssuer Mantenha o valor como apresentado aqui.
scope O escopo controla os dados que o aplicativo pode acessar ou processar em nome do usuário. Como o aplicativo usa o SDK para autenticação, o escopo é openid. O aplicativo também implementa o caso de uso get user details, para o qual você também deve usar o escopo urn:opc:idm:t.user.me.

Os atributos logoutSufix e redirectURL são usados pela aplicação. Portanto, eles não são exigidos pelo SDK.

O aplicativo implementa a definição da função auth, que mapeia o URL /auth. Quando um usuário é autenticado no Oracle Identity Cloud Service, o browser faz uma solicitação para este URL.

A função auth inicializa o Gerenciador de Autenticação, usa os atributos de configuração JSON como parâmetros, usa o SDK para gerar o URL do código de autorização Oracle Identity Cloud Service e, em seguida, redireciona o browser para esse 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)

Os parâmetros a seguir são usados para gerar o URL do código de autorização:

Tabela - Parâmetros usados para gerar o URL do código de autorização

Nome do Parâmetro Descrição do Parâmetro
options["redirectURL"] Após o acesso bem-sucedido, o Oracle Identity Cloud Service redireciona o navegador da Web do usuário para este URL. Esse URL deverá corresponder ao que você irá configurar para o aplicativo confiável na console do Oracle Identity Cloud Service.
options["scope"] O escopo do OAuth ou OpenID Connect da autenticação. Este aplicativo requer somente autenticação openid.
state O aplicativo Web usa esse código para verificar se é possível estabelecer comunicação com o Oracle Identity Cloud Service. O parâmetro é definido pelo protocolo OAuth.
response_type O valor exigido pelo tipo de concessão de código de autorização (por exemplo, code).

A função callback usa o parâmetro de URL do código de autorização para solicitar um token de acesso. O token de acesso é armazenado como um cookie, que é enviado ao navegador para 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})

A função myProfile acessa o token de acesso do usuário, chama a função getAuthenticatedUser para recuperar as informações do usuário como texto JSON e, em seguida, envia as informações para o myProfile.html para conversão.

# 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 efetuar sign-out do usuário do sign-on único entre o aplicativo e o Oracle Identity Cloud Service, o aplicativo Web Python implementa a função logout. Esta função invalida a sessão do usuário e redireciona o usuário para o URL de log-out do Oracle Identity Cloud ServiceOAuth. Esse URL é configurado no arquivo config.json como 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)