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

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

Sobre este Tutorial

OpenID O Connect é um protocolo de autenticação que funciona em conjunto com o OAuth para controlar o acesso dos usuários aos recursos. Ao utilizar o serviço de autenticação e autorizaçã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 de tokens JSON Web (JWT).

Antes de Iniciar

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

  1. Adicione o serviço DataPower® API Gateway de 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 do FindBranch e ative-a conforme explicado no Tutorial: Importando uma API.
  3. Crie o provedor nativo OAuth do MyNativeOAuthProvider, conforme explicado no Tutorial: Implementação da segurança do OAuth.

Adicionar compatibilidade com OIDC a um provedor nativo do OAuth

Para adicionar segurança OIDC a um provedor nativo do ` OAuth `, siga estas etapas:
  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 do OAuth.
    4. Na lista de provedores do OAuth, clique em MyNativeOAuthProvider para abri-lo.
      Novo provedor de serviços de " OAuth "
  2. Na lista de navegação do provedor “Edit Native OAuth ”, 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 Ícone Copiar para copiar a chave a seguir e, em seguida, cole-a no campo “Chave de assinatura do token de identificação ”:
    { "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 do 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 do Cross-Origin Resource Sharing ( CORS ), a ferramenta de teste de assembly não pode ser usada com os navegadores Chrome ou Safari na plataforma macOS Catalina.

Ao testar a nova segurança OIDC no painel de testes do API Manager, você segue os mesmos passos utilizados para testar o provedor nativo do OAuth. O painel de teste não exibe o token JWT recebido junto com o token de acesso; portanto, neste tutorial, você obterá o token JWT usando os comandos ` cURL ` para poder verificar se o token foi devolvido.

  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 Send (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 redirect_uri é o redirecionamento URL do OAuth 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 confirma que você está autenticado por meio do OIDC e do seu provedor nativo de OAuth.

      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.