IBM Cloud Docs
Identidade e autorização do aplicativo

Identidade e autorização do aplicativo

Com o IBM Cloud® App ID, é possível proteger aplicativos usando o fluxo de identidade eautorização do aplicativo aproveitando os recursos do OAuth2.0.

Entendendo o fluxo de comunicação

Há várias razões pelas quais você pode desejar que um aplicativo se comunique com outro serviço ou aplicativo sem nenhuma intervenção do usuário. Por exemplo, um aplicativo não interativo que precisa acessar outro aplicativo para executar seu trabalho. Isso pode incluir processos, CLIs, daemons ou um dispositivo IoT que monitora e relata variáveis de ambiente para um servidor de envio de dados. Ocaso de uso específico é exclusivo para cada aplicativo, mas a coisa mais importante a ser lembrada é que assolicitações são trocadas em nome do aplicativo, não em nome de um usuário final, e é o aplicativo que é autenticado eautorizado.

Como o fluxo funciona?

O App ID aproveita o fluxo de credenciais do cliente OAuth 2.0 para proteger a comunicação. Depois que um aplicativo é registrado com o App ID, ele obtém um identificador de cliente e um segredo. Comessas informações, o aplicativo pode solicitar um token de acesso por meio doApp ID e ser autorizado a acessar uma API ou um recurso protegido. Nofluxo de identidade e autorização do aplicativo, apenas um token de acesso é fornecido ao aplicativo. Ele não obtém um token de identidade ou um token de atualização. Paraobter mais informações sobre tokens, consulte Entendendo os tokens.

Esse fluxo de trabalho deve ser usado somente com aplicativos confiáveis, nos quais não há risco de uso indevido ou vazamento do segredo. O aplicativo sempre mantém o segredo do cliente. Ele não funcionará para aplicativos móveis.

Qual é a aparência desse fluxo?

Na imagem a seguir, é possível ver a direção da comunicação entre o serviço e seu aplicativo.

caption-side=bottom"
App ID identidade do aplicativo e fluxo de autorização Identidade do aplicativo e fluxo de autorização

  1. Registre o aplicativo que precisa autenticar para acessar um recurso protegido com o App ID.
  2. O aplicativo A é registrado com o App ID para obter um identificador de cliente e um segredo.
  3. O aplicativo A faz uma solicitação para o terminal /token do servidor de autorizações App ID enviando as credenciais recuperadas na etapa anterior.
  4. O App ID valida a solicitação, autentica o aplicativo e retorna uma resposta ao Aplicativo A que contém um token de acesso.
  5. Agora o aplicativo A é capaz de usar o token de acesso válido para enviar solicitações para recursos protegidos, como o Aplicativo B.

O segredo do cliente que é usado para autenticar o cliente é altamente sensível e deve ser mantido confidencial. Como o aplicativo usa o segredo do cliente no aplicativo, esse fluxo de trabalho deve ser usado somente com aplicativos confiáveis. O uso de um aplicativo confiável assegura que o segredo do cliente não vaze nem seja mal utilizado.

Registrando seu aplicativo

Com a GUI

  1. Na guia Aplicativo do painel do App ID, clique em Incluir aplicativo.
  2. Inclua o nome do aplicativo e clique em Salvar para retornar a uma lista de seus aplicativos registrados. O nome de seu aplicativo não pode exceder 50 caracteres.
  3. Na lista de apps registrados, selecione o aplicativo que você incluiu na etapa anterior. A linha se expande para mostrar suas credenciais.

Com a API

  1. Faça uma solicitação de POST para o terminal /management/v4/<tenantID>/applications

    curl -X POST \  https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/ \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer <IAMToken>' \
    -d '{"name": "<applicationName>"}'
    

    Resposta de exemplo:

    {
    "clientId": "c90830bf-11b0-4b44-bffe-9773f8703bad",
    "tenantId": "b42f7429-fc24-48fa-b4f9-616bcc31cfd5",
    "secret": "YWQyNjdkZjMtMGRhZC00ZWRkLThiOTQtN2E3ODEyZjhkOWQz",
    "name": "testing",
    "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/b42f7429-fc24-48fa-b4f9-616bcb31cfd5",
    "profilesUrl": "https://us-south.appid.cloud.ibm.com",
    "discoveryEndpoint": "https://us-south.appid.cloud.ibm.com/oauth/v4/b42f7429-fc24-48fa-b4f9-616bcb31cfd5/.well-known/openid-configuration"
    }
    

Obtendo um token de acesso

Após o seu aplicativo ser registrado com o App ID e você obter suas credenciais,será possível fazer uma solicitação para o servidor de autorizações App ID para obter um token de acesso.

  1. Faça uma solicitação HTTP POST para o ponto de extremidade /token. Aautorização para a solicitação é Basic auth com o identificador de cliente e o segredo sendo usadocomo o nome de usuário e a senha que são codificados em Base64.

    curl -X POST https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>/token \
       -H 'Authorization: Basic base64Encoded{clientId:secret}' \
       -H 'Content-Type: application/x-www-form-urlencoded' \
       -d 'grant_type=client_credentials'
    

    Resposta de exemplo:

    {
    "access_token": "eyJhbGciOiJS...F9A",
    "expires_in": "3600",
    "token_type": "Bearer"
    }
    

Tutorial: fluxo de ponta a ponta com o SDK Node.js

  1. Obtenha um token de acesso de uma das seguintes maneiras:

    • Do SDK do servidor Node.js App ID usando o gerenciador de tokens. Inicialize o gerenciador de token com suas credenciais de aplicativo e faça uma chamada para o método getApplicationIdentityToken() para obter o token.

      const TokenManager = require('ibmcloud-appid').TokenManager;
      const config = {
      clientId: "<clientID>",
      tenantId: "<tenantID>",
      secret: "{secret}",
      oauthServerUrl: "https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>"
      };
      const tokenManager = new TokenManager(config);
      tokenManager.getApplicationIdentityToken().then((appIdAuthContext) => {
      console.log(' Access tokens from SDK : ' + JSON.stringify(appIdAuthContext));
      }).catch((err) => {
      //console.error('Error retrieving tokens : ' + err);
      });
      
    • Por meio do servidor de autorizações do App ID.

      O oauthServerUrl na solicitação é obtido quando você registra seu aplicativo. Se você registrou seu aplicativo com as APIs de gerenciamento, a URL do servidor estará no corpo de resposta. Sevocê registrou seu aplicativo ligando-o ao console do IBM Cloud, a URL poderá ser localizada em seu objeto JSON VCAP_SERVICES ou por meio de seus segredos do Kubernetes.

      var request = require('request');
      function getAccessToken() {
      let options = {
            method: 'POST',
            url: oauthServerUrl + '/token',
            headers: { 'content-type': 'application/x-www-form-urlencoded',
               'Authorization': 'Basic ' +Buffer.from('clientId: secret').toString('base64')
            },
            form: {
               grant_type: 'client_credentials'
            }
      };
      return new Promise((resolve, reject) => {
            request(options, function (error, response, body) {
               if (error) {
                  return reject(error);
               }
               let data = JSON.parse(body);
               if(data.access_token) {
                  resolve(data.access_token);
               } else {
                  reject(data);
               }
            })
      });
      }
      
  2. Faça uma solicitação para seu recurso protegido usando o token de acesso obtido na etapa anterior.

    let options = {
       method: 'GET',
       url: 'http://localhost:8081/protected_resource',
       headers: { authorization : 'Bearer ' + accessToken}
    }
    request(options, function (error, response, body) {
       if (error) {
          console.log(error)
       } else {
             res.status(response.statusCode).send({
       console.log(JSON.stringify(body));
             });
       }
    });
    
  3. Faça com que seus recursos protegidos fiquem seguros usando a estratégia de API por meio do SDK do Node.js do App ID.

    const express = require('express'),
       passport = require('passport');
       APIStrategy = require("ibmcloud-appid").APIStrategy;
    var app = express();
    app.use(passport.initialize());
    passport.use(new APIStrategy({
       oauthServerUrl: "https://{region}.appid.cloud.ibm.com/oauth/v4/{tenant-ID}",
       tenantId:"{tenant-ID}"
    }));
    app.get('/protected_resource',
       passport.authenticate(APIStrategy.STRATEGY_NAME, {session: false}),
       (req, res) => {
             res.send("Hello from protected resource");
    });