Saiba Mais sobre Autenticação entre Aplicativos Node.js e Oracle Identity Cloud Service

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

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

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

  • Métodos e funções do Node.js SDK

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 Node.js 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. O aplicativo Web Node.js usa esse token de acesso 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 o fluxo redigido para integrar seus aplicativos Node.js 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 do Node.js

O aplicativo Node.js Web implementa dois casos de uso: um para autenticar usuários e o outro para acessar informações detalhadas sobre o usuário 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.

Caso de Uso Nº1: Autenticar um 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. Depois que o usuário acessa, 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.

Caso de Uso nº2: Obter Detalhes sobre o 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

O Node.js SDK é uma estratégia de passaporte do Node.js que você adiciona à sua pasta do Node.js modules. Esse SDK também é baseado em promessas Node.js. Todas as dependências de terceiros de que o Node.js SDK precisa são definidas no arquivo package.json do SDK. Você precisa usar pelo menos este conjunto de módulos na sua aplicação Node.js Web.

"dependencies": {
    "async": "^2.1.2",
    "bunyan": "^1.8.5",
    "cache-manager": "^2.2.0",
    "json-web-token": "^2.1.3",
    "jsonwebtoken": "^7.1.9",
    "jwk-to-pem": "^1.2.6",
    "jws": "^3.1.4",
    "lru": "^3.1.0",
    "passport": "^0.3.2",
    "promise": "^7.1.1",
    "querystring": "^0.2.0",
    "request": "^2.79.0",
    "rsa-pem-to-jwk": "^1.1.3",
    "util": "^0.10.3"
  },

Uma aplicação Web Node.js foi desenvolvida usando os módulos Node.js express e express-handlebars, que implementa rotas de URL na forma de uma função app.get() para cada URL.

O Node.js SDK requer uma variável JSON que é carregada com informações de conexão do Oracle Identity Cloud Service. O aplicativo Web Node.js usa a variável ids para armazenar estas informações:

var ids = {
    oracle: {
         "ClientId": '123456789abcdefghij',
         "ClientSecret": 'abcde-12345-zyxvu-98765-qwerty',
         "ClientTenant": 'idcs-abcd1234',
         "IDCSHost": 'https://%tenant%.identity.oraclecloud.com',
         "AudienceServiceUrl" : 'https://idcs-abcd1234.identity.oraclecloud.com',
         "TokenIssuer": 'https://identity.oraclecloud.com/',
         "scope": 'urn:opc:idm:t.user.me openid',
         "logoutSufix": '/oauth2/v1/userlogout',
         "redirectURL": 'http://localhost:3000/callback'
    }
};
 
module.exports = ids;

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

Nome Descrição
ClientId O valor do ID do Cliente gerado após você registrar o aplicativo Node.js Web na console do Identity Cloud Service.
ClientSecret O valor do Segredo do Cliente gerado após você registrar o aplicativo Node.js Web na console do Identity Cloud Service.
ClientTenant O prefixo do domínio da instância do Oracle Identity Cloud Service. Esse prefixo geralmente é semelhante a idcs-abcd1234.
IDCSHost O sufixo de domínio da instância do Oracle Identity Cloud Service. No runtime, o placeholder %tenant% é substituído pelo valor do atributo ClientTenant.
AudienceServiceUrl O URL do nome de domínio totalmente qualificado da sua instância do Oracle Identity Cloud Service.
TokenIssuer Para esse atributo, a Oracle recomenda que você mantenha o valor https://identity.oraclecloud.com/.
scope

O escopo controla os dados que o aplicativo pode acessar ou processar em nome do usuário do Oracle Identity Cloud Service.

Se o aplicativo usar o SDK para autenticar um usuário, o escopo será openid. Se o aplicativo usar o SDK para obter detalhes sobre o usuário, o escopo será urn:opc:idm:t.user.me openid.

O aplicativo usa os atributos logoutSufix e redirectURL. O SDK não os exige.

O aplicativo Node.js implementa a rota de URL do /oauth/oracle. Quando um usuário decide se autenticar no Oracle Identity Cloud Service, o Web browser faz uma solicitação a esse URL. Esta rota usa o SDK para gerar o URL de autorização do Oracle Identity Cloud Service.

//Loading the configurations
var auth = require('./auth.js');
 
//Route for /oauth/oracle
app.get("/auth/oracle", function(req, res){
    //Authentication Manager loaded with the configurations.
    am = new IdcsAuthenticationManager(auth.oracle);
    //Using Authentication Manager to generate the Authorization Code URL, passing the
    //application's callback URL as parameter, along with code value and code parameter.
    am.getAuthorizationCodeUrl(auth.oracle.redirectURL, auth.oracle.scope, "1234", "code")
        .then(function(authZurl){
            //Redirecting the browser to the Oracle Identity Cloud Service Authorization URL.
            res.redirect(authZurl);
        }).catch(function(err){
            res.end(err);
        })
});

Esta função carrega os parâmetros JSON para uma variável, inicializa um gerenciador de autenticação e usa a função IdcsAuthenticationManager.getAuthorizationCodeUrl() do SDK Node.js para gerar o URL do código de autorização. Esta função usa promessa para redirecionar o navegador da web do usuário quando o URL do código de autorização é gerado ou renderizar um erro no navegador.

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

Nome Descrição
auth.oracle.redirectURL Depois que um usuário acessa, 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 a aplicação confiável na console do Identity Cloud Service. Consulte Registrar o Aplicativo Node.js para obter mais informações sobre como especificar um URL de redirecionamento para o aplicativo Node.js Web.
auth.oracle.scope O escopo do OAuth ou OpenID Connect da autenticação. Este aplicativo requer somente autenticação openid.
state O protocolo OAuth define esse parâmetro. O aplicativo Node.js Web de amostra usa esse código para verificar se a comunicação pode ser estabelecida como Oracle Identity Cloud Service. Para este exemplo, o valor deste parâmetro é 1234.
response_type O parâmetro necessário pelo tipo de concessão de código de autorização. Para este exemplo, o valor deste parâmetro é code.

Após o usuário acessar o, o Oracle Identity Cloud Service redireciona o web browser do usuário para um URL de callback, que o desenvolvedor deve implementar. O aplicativo Web Node.js usa a rota /callback para tratar essa solicitação.

//Route for /callback
app.get("/callback", function(req,res){
    //Authentication Manager loaded with the configurations.
    var am = new IdcsAuthenticationManager(auth.oracle);
    //Getting the authorization code from the "code" parameter
    var authZcode = req.query.code;
    //Using the Authentication Manager to exchange the Authorization Code to an Access Token.
    am.authorizationCode(authZcode)
        .then(function(result){
            //Getting the Access Token Value.
            res.cookie(config.IDCS_COOKIE_NAME, result.access_token);
            res.redirect('/auth.html');
        }).catch(function(err){
            res.end(err);
        })
});

O aplicativo Node.js usa o código de autorização para solicitar um token de acesso. O token de acesso é armazenado como um cookie, que é enviado ao Web browser para uso futuro.

A função IdcsAuthenticationManager.authorizationCode() do Node.js SDK também usa promessa (uma instrução then-catch) para definir o token de acesso como um cookie e redirecionar o navegador para a página /auth.html.

O Node.js SDK se baseia na estrutura de passaporte do Node.js. Portanto, você precisa encaminhar o token de acesso como uma variável de cabeçalho para o handler de URL /auth e usar o método passport.authenticate() com o Nome da Estratégia Oracle Identity Cloud Service como um parâmetro:

//Uses passport to create a User Session in Node.js.
//Passport sets a user attribute in the request as a json object.
app.get('/auth', passport.authenticate(config.IDCS_STRATEGY_NAME, {}), function(req, res) {
   res.redirect('/home');
});

Depois que o método passport.authenticate() cria a sessão da aplicação, a função redireciona o navegador da Web do usuário para um URL protegido na aplicação /home. Além de /home, a aplicação Web Node.js tem três outros URLs protegidos: /appDetails, /userInfo e /myProfile.

Cada URL protegido precisa verificar se a sessão do usuário foi criada anteriormente. A função a seguir é usada por cada função app.get() para esses URLs.

function ensureAuthenticated(req, res, next) {
   if (req.isAuthenticated()) {
      return next();
   }
   res.redirect('/login')
}

O aplicativo Node.js trata a rota do /myProfile e obtém informações definidas na sessão pelo método passport.authenticate(), conforme a seguir:

app.get("/myProfile", ensureAuthenticated, function(req,res){
   //User Manager loaded with the configurations
   var um = new IdcsUserManager(auth.oracle);
   //Using the user id in the request attribute to render the user json in the screen.
   um.getUser(req.user.id)
      .then(function(user){
         res.render('myProfile', {
         layout: 'privateLayout',
         title: 'My Profile',
         user: req.user,
         userInfo: JSON.stringify(user, null, 2)
         });
      }).catch(function(err1){
         res.end(err1);
      })
});

Depois de inicializar o objeto UserManager, o handler da rota /myProfile usa a função IdcsUserManager.getUser() do SDK para obter um objeto JSON que representa o perfil do usuário. A aplicação envia o objeto JSON para o arquivo myProfile.handlebars para conversão no web browser.

Para efetuar sign-out do usuário do sign-on único entre a aplicação e o Oracle Identity Cloud Service, a aplicação Node.js Web implementa a rota /logout, da seguinte forma:

app.get('/logout', function(req, res){
   req.logout();
   res.clearCookie();
   res.redirect(auth.oracle.IDCSHost + auth.oracle.logoutSufix);
});

Esta rota invalida a sessão do aplicativo, remove quaisquer cookies definidos anteriormente e redireciona o Web browser do usuário para o URL de log-out do OAuth do Oracle Identity Cloud Service. Esse URL é configurado no objeto de configuração JSON.