Este tópico descreve como usar o fluxo de código de autorização OAuth 2.0 com Proof Key for Code Exchange (PKCE) para permitir que um aplicativo nativo (como um app desktop ou móvel) acesse as APIs do Alibaba Cloud em nome de um usuário com segurança.
Pré-requisitos
Você já criou um aplicativo nativo OAuth 2.0 no console do Resource Access Management (RAM) e especificou uma url de redirecionamento.
Armazene o ID do seu aplicativo com segurança. Aplicativos nativos não usam segredo de cliente.
Visão geral do fluxo de autorização
O fluxo de código de autorização com PKCE é o método mais seguro e recomendado para aplicativos nativos. Ele adiciona uma camada de segurança que impede ataques de interceptação de código de autorização.
Geração do code_verifier e do code_challenge: O aplicativo nativo gera uma string aleatória de alta entropia (o
code_verifier) e uma versão transformada dela (ocode_challenge).Início do login pelo usuário: O aplicativo abre o navegador no endpoint de autorização do Alibaba Cloud, passando o
code_challengee seu método de transformação.Concessão de consentimento pelo usuário: O usuário faz login na conta do Alibaba Cloud e concede as permissões solicitadas ao aplicativo.
Recebimento do código de autorização: O servidor de autorização redireciona o usuário à url de redirecionamento especificada pelo aplicativo, incluindo um código de autorização de uso único.
Troca do código por tokens: O aplicativo envia uma requisição ao endpoint de token do Alibaba Cloud para trocar o código de autorização e o
code_verifieroriginal por um token de acesso e um token de atualização. O servidor valida ocode_verifiercomparando-o aocode_challengeda primeira etapa.Acesso a recursos protegidos: O aplicativo usa o token de acesso para fazer chamadas de API autorizadas aos serviços do Alibaba Cloud.
Etapa 1: Solicite um código de autorização com PKCE
Para iniciar o fluxo, gere os parâmetros PKCE no aplicativo e direcione o usuário ao endpoint de autorização.
1. Gere os parâmetros PKCE
Primeiro, crie e registre um code_verifier, que consiste em uma string aleatória criptográfica de alta entropia com 43 a 128 caracteres.
Em seguida, crie um code_challenge transformando o code_verifier com um dos métodos a seguir:
|
Método de transformação |
Descrição |
|
|
O |
|
|
(Recomendado) O |
Exemplo com S256:
Se
code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXkEntão
code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
2. Redirecione para o endpoint de autorização
Abra o navegador do sistema no endpoint de autorização do Alibaba Cloud (https://signin.alibabacloud.com/oauth2/v1/auth) com os seguintes parâmetros.
|
Parâmetro |
Obrigatório |
Descrição |
|
client_id |
Sim |
ID do seu aplicativo nativo. |
|
redirect_uri |
Sim |
url de redirecionamento para onde o usuário será enviado após conceder consentimento. Deve corresponder exatamente a uma das URIs registradas para o aplicativo. |
|
response_type |
Sim |
Defina como |
|
scope |
Não |
Lista de escopos OAuth solicitados pelo aplicativo, separados por espaços. Se omitida, todos os escopos configurados para o aplicativo serão solicitados. |
|
state |
Não |
Valor opaco usado para manter o estado entre a requisição e o callback. Recomendamos fortemente usar uma string aleatória e imprevisível para evitar ataques de Cross-Site Request Forgery (CSRF). |
|
code_challenge_method |
Não |
Método de transformação utilizado. Valores válidos: Valor padrão: |
|
code_challenge |
Não |
String Nota
Se você omitir este parâmetro, o PKCE não será usado e o fluxo ficará vulnerável a ataques de interceptação de código de autorização. Nesse caso, um invasor que interceptar o código poderá trocá-lo por um token de acesso. |
|
prompt |
Não |
Defina este parâmetro como |
Exemplo de requisição
https://signin.alibabacloud.com/oauth2/v1/auth?
client_id=98989****
&redirect_uri=meeting%3A%2F%2Fauthorize%2F
&response_type=code
&scope=openid%20%2Fworksuite%2Fuseraccess
&state=123456****
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSst****
&code_challenge_method=S256
Exemplo de resposta
Se o usuário conceder consentimento, o servidor de autorização redirecionará o navegador para sua redirect_uri, anexando o código de autorização e o estado como parâmetros de consulta.
GET HTTP/1.1 302 Found
Location: meeting://authorize/?code=ABAFDGDFXYZW888&state=123456****
Etapa 2: Troque o código de autorização por um token de acesso
Após receber o código de autorização, envie uma requisição POST do servidor backend para o endpoint de token do Alibaba Cloud (https://oauth.alibabacloud.com/v1/token) para trocar o código pelos tokens.
Parâmetros da requisição (corpo POST)
|
Parâmetro |
Obrigatório |
Descrição |
|
code |
Sim |
Código de autorização recebido na Etapa 1. |
|
client_id |
Sim |
ID do seu aplicativo nativo. |
|
redirect_uri |
Sim |
Mesma url de redirecionamento usada na requisição da Etapa 1. |
|
grant_type |
Sim |
Defina como |
|
code_verifier |
Não |
String |
Exemplo de requisição
POST /v1/token HTTP/1.1
Host: oauth.alibabacloud.com
Content-Type: application/x-www-form-urlencoded
code=ABAFDGDFXYZW888&
client_id=98989****
redirect_uri=meeting://authorize/&
grant_type=authorization_code&
code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
Exemplo de resposta
Se a requisição for bem-sucedida, o endpoint de token retornará um objeto JSON contendo os tokens.
{
"access_token": "eyJraWQiOiJrMTIzNCIsImVuYyI6****",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "Ccx63VVeTn2dxV7ovXXfLtAqLLERA****",
"id_token": "eyJhbGciOiJIUzI1****"
}
Etapa 3 (Opcional): Atualize o token de acesso
Use o token de atualização para obter um novo token de acesso sem exigir que o usuário faça login novamente. Endpoint: https://oauth.alibabacloud.com/v1/token
Parâmetros da requisição (corpo POST)
|
Parâmetro |
Obrigatório |
Descrição |
|
refresh_token |
Sim |
Token de atualização recebido anteriormente. |
|
client_id |
Sim |
ID do seu aplicativo nativo. |
|
grant_type |
Sim |
Defina como |
Exemplo de requisição
POST /v1/token HTTP/1.1
Host: oauth.alibabacloud.com
Content-Type: application/x-www-form-urlencoded
refresh_token=Ccx63VVeTn2dxV7ovXXfLtAqLLERAH****
client_id=98989****
grant_type=refresh_token
Exemplo de resposta
O endpoint de token retorna um novo token de acesso.
{
"access_token": "eyJraWQiOiJrMTIzNCIsImVuYyI6****",
"token_type": "Bearer",
"expires_in": 3600,
}
Revogue um token de atualização
Quando um usuário sair do aplicativo ou desconectar a conta, revogue o token de atualização associado para invalidá-lo.
Endpoint: https://oauth.alibabacloud.com/v1/revoke
Parâmetros da requisição (corpo POST)
|
Parâmetro |
Obrigatório |
Descrição |
|
token |
Sim |
Token de atualização a ser revogado. |
|
client_id |
Sim |
ID do seu aplicativo nativo. |
Uma requisição bem-sucedida retorna o status HTTP 200 OK.