Tutorial: Implementação da segurança do OIDC

Este tutorial mostra como adicionar o recurso OIDC ( OpenID Connect) a um provedor OAuth nativo existente usando o API Manager.

Sobre este Tutorial

OpenID O Connect é um protocolo de autenticação que funciona com o OAuth para controlar o acesso do usuário aos recursos. Ao usar o OAuth para determinar as autorizações de um usuário, você também pode usar o OIDC para autenticar o usuário por meio do uso de JSON Web Tokens (JWT).

Neste tutorial, você concluirá as lições a seguir:
  1. Adicionar o recurso OIDC a um provedor nativo OAuth
  2. Teste de segurança do OIDC

Antes de iniciar

Este tutorial usa a API FindBranch predefinida e um provedor OAuth nativo existente configurado com o tipo de concessão "Código de acesso". Para preparar seu ambiente para este tutorial, conclua as seguintes tarefas:

  1. Adicione o serviço de gateway DataPower® API Gateway ao catálogo do Sandbox, conforme explicado em Criação e configuração de catálogos.

    O catálogo do Sandbox deve ser configurado para usar pelo menos um gateway. Para este tutorial, você deve usar o mesmo gateway que a API FindBranch usa.

  2. Importe a API FindBranch e ative-a conforme explicado no Tutorial: Importando uma API.
  3. Crie o provedor OAuth nativo MyNativeOAuthProvider conforme explicado no Tutorial: Implementando a segurança do OAuth.

Adicionar o recurso OIDC a um provedor nativo OAuth

Para adicionar segurança OIDC a um provedor OAuth nativo, conclua as etapas a seguir:
  1. Abra o provedor OAuth para edição:
    1. Faça login no API Manager.
    2. Na página inicial, clique no bloco Gerenciar recursos.
      Mosaico Gerenciar recursos
    3. Na lista de navegação Recursos, clique em Provedores OAuth.
    4. Na lista de provedores OAuth, clique em MyNativeOAuthProvider para abri-lo.
      Novo provedor OAuth
  2. Na lista de navegação Edit Native OAuth Provider (Editar provedor OAuth nativo ), clique em OpenID Connect.Formulário OIDC
  3. Na página OpenID Connect, selecione Enable OIDC (Ativar OIDC ).

    Formulário OIDC

  4. Se alguma configuração estiver selecionada na lista Tipos de resposta híbrida de suporte na página, limpe as seleções.
  5. Selecione Gerar automaticamente o conjunto da API do OIDC.

    Essa opção atualiza sua API com o fluxo do OIDC.

    Configurações de geração automática

    Uma mensagem é exibida para avisar que você deve fornecer um objeto criptográfico de assinatura de token de ID ou uma chave de assinatura de token de ID. Neste tutorial, você fornece uma chave JWK (na próxima etapa).

  6. Clique em Ícone Copiar para copiar a seguinte chave e, em seguida, cole-a no campo ID token signing key (chave de assinatura de token de ID ):
    { "alg": "HS256", "kty": "oct", "use": "sig", "k": "o5yErLaE-dbgVpSw65Rq57OA9dHyaF66Q_Et5azPa-XUjbyP0w9iRWhR4kru09aFfQLXeIODIN4uhjElYKXt8n76jt0Pjkd2pqk4t9abRF6tnL19GV4pflfL6uvVKkP4weOh39tqHt4TmkBgF2P-gFhgssZpjwq6l82fz3dUhQ2nkzoLA_CnyDGLZLd7SZ1yv73uzfE2Ot813zmig8KTMEMWVcWSDvy61F06vs_6LURcq_IEEevUiubBxG5S2akNnWigfpbhWYjMI5M22FOCpdcDBt4L7K1-yHt95Siz0QUb0MNlT_X8F76wH7_A37GpKKJGqeaiNWmHkgWdE8QWDQ", "kid": "hs256-key" }

    Essa chave não é segura e destina-se apenas ao uso neste tutorial.

    Chave de assinatura de token de ID
  7. No campo Algoritmo de assinatura de token de ID, selecione HS256 como o algoritmo de assinatura para essa chave.

    Algoritmo de assinatura do token de ID

  8. Clique em Salvar.

Teste de segurança do OIDC

Observação: devido às restrições de compartilhamento de recursos entre origens (CORS), a ferramenta de teste de montagem não pode ser usada com os navegadores Chrome ou Safari na plataforma macOS Catalina.

Ao testar a nova segurança do OIDC no painel Teste do API Manager, você conclui as mesmas etapas usadas para testar o provedor OAuth nativo. O painel Teste não exibe o token JWT recebido com o token de acesso, portanto, neste tutorial, você obterá o token JWT usando os comandos cURL para que possa verificar se o token é retornado.

  1. Configure o painel de teste para chamar sua API:
    1. Na página Develop / findbranch, clique na guia Test no cabeçalho da página.

      A API importada FindBranch já tem uma definição, que usa uma única política chamada Invoke para executar a API. Essa API está pronta para ser testada.

    2. Para ativar a API, clique em Target Configuration.

      FindBranch API

    3. Na janela Preferences (Preferências ), ative a opção Auto-publish (Publicação automática) para definir o status da API como on-line.

      Painel de teste

    4. Clique em Enviar.

      Invocação de teste

    5. Se for exibida a mensagem Nenhuma resposta recebida, clique em Abrir o servidor.

      Mensagem de ausência de resposta

      Uma nova guia do navegador é aberta. Se for exibida uma mensagem de erro, ignore-a.

  2. Vá para uma janela de comando e use os comandos cURL para obter o token de acesso e o token JWT que permitem que você use a API:
    Observação: O código de autorização que você recebe do provedor OAuth expira após alguns minutos. Para evitar a necessidade de repetir a solicitação, prepare os dois comandos para essa etapa o máximo possível antes de executar o primeiro comando.
    1. Execute o seguinte comando cURL para solicitar um código de autorização para a API:
      curl -k -i --header "Authorization: Basic dXNlcjpwYXNz"\
       --request GET "Authorization_URL\
      ?redirect_uri=https://example.com/redirect\
      &scope=openid+details\
      &response_type=code\
      &client_id=Client_ID"
      Em que:
      • O parâmetro cURL -k permite que cURL execute sua operação mesmo em conexões de servidor inseguras.
      • O parâmetro cURL -i inclui cabeçalhos de resposta de protocolo na saída para que você possa visualizar a resposta na janela de comando.
      • O cabeçalho de autorização especifica que você se autenticará no registro de usuário (o registro de usuário AuthURL que você criou) usando a autenticação Basic e fornece a senha ("pass") codificada em base64.
      • O endereço Authorization_URL é copiado do painel Teste.
      • O endereço redirect_uri é o redirecionamento do OAuth URL que você configurou no aplicativo de teste Sandbox.
      • O scope especifica dois escopos, concatenados com + : o escopo details da API que você acessará e o escopo do OIDC que o autoriza.
      • O endereço response_type é code porque você deseja receber um código de autorização.
      • O endereço Client_ID é copiado da seção Identification (Identificação) do painel Test (Teste) e garante que você possa acessar o aplicativo de teste Sandbox.
      Exemplo:
      curl -k -i --header "Authorization: Basic dXNlcjpwYXNz"\
       --request GET "https://example.com/eb-org/sandbox/mynativeoauthprovider/oauth2/authorize\
      ?redirect_uri=https://example.com/redirect\
      &scope=openid+details\
      &response_type=code\
      &client_id=01c43d1620e0c4e6ded0dec20b5655d9"
      A resposta é semelhante ao exemplo a seguir:
      HTTP/1.1 302 Found
      Connection: Keep-Alive
      Transfer-Encoding: chunked
      X-RateLimit-Limit: name=default,100;
      X-RateLimit-Remaining: name=default,93;
      User-Agent: curl/7.55.1
      Accept: */*
      X-Client-IP: IP_address
      X-Global-Transaction-ID: 12df8d855e7e18ee00000681
      Location: https://example.com/redirect? code=AALxLnKixp9VIy3PvVKBwfbuTgNbwnZtHB6iS9b_BUw39UZZjUi2CeFdPYJZW0mgqNMtzFUhrsfu3FFiC9aGfHnJ3CqdIANqlo-v-DkQv7ELWw 
      Content-Type: text/xml
      Date: Fri, 27 Mar 2020 15:17:02 GMT
    2. Copie o código de autorização (retornado no parâmetro code ) para que você possa usá-lo na próxima etapa.
    3. Execute o seguinte comando cURL para trocar o código de autorização por um token de acesso e um token JWT:
      curl -k -i --header "Content-Type: application/x-www-form-urlencoded"\
       --request POST "Token_URL"\
       --data-urlencode "code=Authorization_code"\
       --data-urlencode "client_secret=Client_Secret"\
       --data-urlencode "grant_type=authorization_code"\
       --data-urlencode "scope=openid details"\
       --data-urlencode "client_id=Client_ID"
      Em que:
      • O endereço Token_URL é copiado do painel Teste.
      • O endereço Authorization_code é copiado da resposta ao comando anterior.
      • O endereço Client_Secret é copiado da seção "Identification" (Identificação) do painel de teste.
      • O endereço grant_type é "authorization_code".
      • O scope especifica novamente dois escopos (separados por um espaço nesse comando porque os valores estão entre aspas).
      • O endereço Client_ID é copiado da seção "Identification" (Identificação) do painel de teste.
      Exemplo:
      curl -k -i --header "Content-Type: application/x-www-form-urlencoded"\
       --request POST "https://example.com/eb-org/sandbox/mynativeoauthprovider/oauth2/token"\
       --data-urlencode "code=AAJ8zz5SvYgxFw0zY0fOxAOiDeaw_PLR6dAFh-ojXVjv-80TB25VGfj28J4Jf7jzgaWVVfLQuVTRSfUbp2hDjYsX9QmZHJOg5p_bfHFWBlQlLg"\
       --data-urlencode "client_secret=d6634763de6c612ae69636d0fc948650"\
       --data-urlencode "grant_type=authorization_code"\
       --data-urlencode "scope=openid details"\
       --data-urlencode "client_id=01c43d1620e0c4e6ded0dec20b5655d9"
      A resposta é semelhante ao exemplo a seguir:
      {"token_type":"Bearer", "access_token":"AAIgMDFjNDNkMTYyMGUwYzRlNmRlZDBkZWMyMGI1NjU1ZDkm4gPMmFjgv2XXhI7t6LZ8BcIRaO_LvWirsNDlirJWi_7qqKGp_fr5py7yE_fHoD17ajAUJPPuUjsV5xj7go25JQjk_smS-AYvmPXRi99IxQ" ,"scope":"openid details","expires_in":3600,"consented_on":1585322249, "id_token":"eyJraWQiOiJoczI1Ni1rZXkiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI3NjE2OTRiYS1iYjYzLTRlNWQtOTc1ZS04NThkZGYxMmI2ZTkiLCJpc3MiOiJJQk0gQVBJQ29ubmVjdCIsInN1YiI6InVzZXIiLCJhdWQiOiIwMWM0M2QxNjIwZTBjNGU2ZGVkMGRlYzIwYjU2NTVkOSIsImV4cCI6MTU4NTMyNTg1MiwiaWF0IjoxNTg1MzIyMjUyLCJhdF9oYXNoIjoibDZYRDV5SjVuMTU1MkZSV19pR2k2USJ9.IO1RVPWV5zOhYGmCXUvG0_-9OO0guURPwaEbGOqCpCg" }

      A resposta inclui dois tokens: o token de acesso e o JWT (denominado id_token ). O recebimento desses tokens verifica se você está autenticado usando o OIDC e seu provedor OAuth nativo.

      Observação: Se você receber uma mensagemInvalid requestcom um erro sobre um código expirado, isso significa que o código de autorização expirou. Retorne à subetapa a e repita o processo para obter um novo código de autorização e, em seguida, troque-o rapidamente pelo token de acesso e pelo token JWT.
  3. Retorne ao painel Test (Teste) e clique em Send (Enviar ) para executar a API.

    Não é necessário colar nenhum código no painel de teste porque você usou o cURL para trocar tokens com o API Connect.

    A resposta da API FindBranch exibe o código de status200 OKe as informações do cabeçalho da resposta, e o corpo contém os dados de cada agência bancária.

    Resposta à chamada de API bem-sucedida

O Quê foi Feito Neste Tutorial

Neste tutorial, você concluiu as seguintes atividades:
  • Adicionada segurança OIDC a uma API existente.
  • Testou a segurança solicitando manualmente um código de autorização e trocando-o por um token de acesso mais um token JWT antes de chamar a API.