Table of Contents
Este documento é um tutorial para descrever o uso básico de Authlete APIs a fim de implementar o servidor de autorização OAuth 2.0 que suporta o fluxo de concessão de código de autorização.
Neste tutorial, assumimos os seguintes componentes. Observe que apenas os consoles e APIs da Authlete estão funcionando, enquanto um servidor de autorização e um servidor de recursos realmente não existem.
Em vez disso, você usará o comando curl para simular como esses servidores fazem solicitações de API para Authlete ao receber solicitações de autorização, solicitações de token e solicitações de introspecção de tokens de clientes.
AS FODNs para cada componente são as seguintes. O servidor de autorização e o cliente não existem como indicado acima, mas suas FQDNs são pelo menos necessárias para explicar o fluxo OAuth.
Component | FQDN |
---|---|
Authlete API | api.authlete.com |
Authlete Service Owner console | so.authlete.com |
Authlete Developer console | cd.authlete.com |
Servidor de Autorização | as.example.com |
Cliente | client.example.org |
Resource server | N/A |
Consulte as instruções “Inscreva-se na Authlete e criando um serviço” para criar um novo serviço de API Authlete e cadastrar um cliente no serviço.
Neste tutorial, assumimos que as seguintes propriedades são geradas ou especificadas.
Item | Valor |
---|---|
ID do cliente | Auto-generetad, por exemplo. 12818600553323 |
segredo do client | Gerado automaticamente, por exemplo. -olDIKD9BihRfB8O1JxobUEKBZ7PIV5Z6oaqxAshmoUtUZgB-wjmmxTYDiDV6vM_Mgl267PeNrRftq8cWplvmg |
Tipo de cliente | CONFIDENTIAL |
Redirecionar uris | https://client.example.org/cb/example.com |
Método de autenticação do cliente | CLIENT_SECRET_BASIC |
Vamos tentar o fluxo de concessão de código de autorização usando este ambiente, na próxima seção.
Aqui está um diagrama de sequência neste tutorial. Os números de mensagens no diagrama podem ajudá-lo a entender os seguintes passos.
<figure class=“figure bg-transparent border-0”>
O cliente faz uma solicitação de autorização ao servidor de autorização via agente de usuário (mensagem nº 2, nº 3). Neste tutorial, vamos supor que os seguintes valores são especificados como paramters na solicitação.
de itens Valor | |
---|---|
client_id | 12818600553323 |
response_type | code |
redirect_uri | https://client.example.org/cb/example.com |
O servidor de autorização deve receber o seguinte conteúdo (dobrado para legibilidade) como sequência de consulta HTTP GET do agente de usuário.
redirect_uri=https://client.example.org/cb/example.com
&response_type=code
&client_id=12818600553323
O servidor de autorização deve avaliar esses parâmetros por si só. As regras típicas de avaliação são mostradas abaixo. Depois disso, o servidor de autorização vai processar o fluxo de concessão de código de autorização, uma vez que o valor de response_type
É code
.
12818600553323
foi registrado no servidor de autorizaçãohttps://client.example.org/cb/example.com
partidas com um dos URIs registrados para o clienteresponse_type
, scope
são aplicáveis para o cliente, ou seja, permitido para o cliente especificar em sua solicitaçãoAuthlete /auth/authorization
A API faz o processo de avaliação em nome do servidor de autorização.
Vamos fazer uma solicitação a esta API atuando como o servidor de autorização.
For Linux/Mac, execute curl command as follows (message #4).
Make sure to replace API Key
, API Secret
, Client ID
by your own values generated in the previous step.
curl -s -X POST https://api.authlete.com/api/auth/authorization \
-u '<API Key e.g. 10738933707579>:<API Secret e.g. Xg6jVpJCvsaXvy2ks8R5WzjdMYlvQqOym3slDX0wNhQ>' \
-H 'Content-Type: application/json' \
-d '{ "parameters": "redirect_uri=https://client.example.org/cb/example.com&response_type=code&client_id=<Client ID e.g. 12818600553323>" }'
If you are using Windows 10's bundled curl.exe command via PowerShell, make sure the command is curl.exe
instead of curl
, escape "
characters and use `
to break lines. (message #4).
Make sure to replace API Key
, API Secret
, Client ID
by your own values generated in the previous step.
curl.exe -s -X POST https://api.authlete.com/api/auth/authorization `
-u '<API Key e.g. 10723797812772>:<API Secret e.g. ekYoYTI84qZcpe6bXGzDwduQ1fGBYxJT8K8Tnwd7poc>' `
-H 'Content-Type: application/json' `
-d '{\"parameters\" : \"redirect_uri=https://client.example.org/cb/example.com&response_type=code&client_id=<Client ID e.g. 12800697055611>\"}'
Se a solicitação for apropriada, Authlete faz a seguinte resposta (omitida para brevidade) (mensagem #5).
{
"resultMessage" : "[A004001] Authlete has successfully issued a ticket to the service (API Key = 10738933707579) for the authorization request from the client (ID = 12818600553323). [response_type=code, openid=false]",
"type" : "authorizationResponse",
"resultCode" : "A004001",
"client" : { [...] },
"ticket" : "cA0xUty6I64PnFTjer2g-iM5KIfGpssUHqkfDoMr0xk",
"action" : "INTERACTION",
[...]
"service" : {
[...]
"supportedClaims" : [
[...]
],
"supportedScopes" : [
[...]
],
}
}
Preste atenção a três pares de teclas/valores na resposta; resultMessage
, action
e ticket
.
{
[...]
"ticket" : "cA0xUty6I64PnFTjer2g-iM5KIfGpssUHqkfDoMr0xk",
"action" : "INTERACTION",
"resultMessage" : "[A004001] Authlete has successfully issued a ticket to the service (API Key = 10738933707579) for the authorization request from the client (ID = 12818600553323). [response_type=code, openid=false]",
resultMessage
fornece resultado legível por humanos do processamento da solicitação. (Veja também Interpretando os códigos de resultado da Authlete)action
indica o que o servidor de autorização deve fazer em seguida.ticket
é necessário que o servidor de autorização faça uma solicitação a outra API na próxima etapa.A Authlete também fornece informações de serviço e cliente na resposta. O servidor de autorização os utiliza para perguntar ao proprietário do recurso se ele ou ela autoriza o acesso do cliente ao serviço.
A interação real entre o proprietário do recurso e o servidor de autorização está fora de alcance neste tutorial. Na maioria dos casos, o servidor de autorização autenticaria o usuário com algumas credenciais (por exemplo, ID/senha), determinaria funções e privilégios para o usuário e perguntaria ao usuário se ele ou ela autoriza o acesso (mensagem nº 6, #7).
Vamos supor que o servidor de auhtorização atinja o seguinte estado após a conclusão do processo anterior:
subject
parâmetro, é testuser01
.O servidor de autorização faz uma solicitação para Authlete /auth/authorization/issue
para emissão de um código de autorização. Ele especifica valores de subject
e ticket
que eram uma parte da resposta de /auth/authorization
API, como parâmetros de solicitação.
Execute curl command as follows (message #8). Make sure to replace API Key
, API Secret
, Ticket
by your own values generated in the previous steps.
curl -s -X POST https://api.authlete.com/api/auth/authorization/issue \
-u '<API Key e.g. 10723797812772>:<API Secret e.g. ekYoYTI84qZcpe6bXGzDwduQ1fGBYxJT8K8Tnwd7poc>' \
-H 'Content-Type: application/json' \
-d '{ "ticket": "<Ticket e.g. bi2Kxe2WW5mK_GZ_fDFOpK1bnY6xTy40Ap_8nxf-7AU>", "subject": "testuser01" }'
Execute curl.exe as follows (message #8). Make sure to replace API Key
, API Secret
, Ticket
by your own values generated in the previous steps.
curl.exe -s -X POST https://api.authlete.com/api/auth/authorization/issue `
-u '<API Key e.g. 10723797812772>:<API Secret e.g. ekYoYTI84qZcpe6bXGzDwduQ1fGBYxJT8K8Tnwd7poc>' `
-H 'Content-Type: application/json' `
-d '{ \"ticket\": \"<Ticket e.g. bi2Kxe2WW5mK_GZ_fDFOpK1bnY6xTy40Ap_8nxf-7AU>\", \"subject\": \"testuser01\" }'
Se a solicitação for apropriada, Authlete faz a seguinte resposta (mensagem #9).
{
"responseContent" : "https://client.example.org/cb/example.com?code=3GIJORjvgaEdu2u4KHyaQdGxfHDFsiViwGyZUxeBVrM",
"authorizationCode" : "3GIJORjvgaEdu2u4KHyaQdGxfHDFsiViwGyZUxeBVrM",
"action" : "LOCATION",
"accessTokenDuration" : 0,
"resultMessage" : "[A040001] The authorization request was processed successfully.",
"type" : "authorizationIssueResponse",
"resultCode" : "A040001",
"accessTokenExpiresAt" : 0
}
Preste atenção a três pares de teclas/valores na resposta; resultMessage
, action
e responseContent
.
resultMessage
fornece resultado legível por humanos do processamento da solicitação. (Veja também Interpretando os códigos de resultado da Authlete)action
indica o que o servidor de autorização deve fazer em seguida. O valor nesta resposta é LOCATION
, o que significa que o servidor de autorização deve fazer uma resposta de redirecionamento de volta ao agente do usuário.responseContent
é suposto ser o conteúdo da resposta do servidor de autorização.Espera-se que o servidor de autorização faça a seguinte resposta (dobrada para legibilidade) ao agente do usuário (mensagem nº 10).
HTTP/1.1 302 Found
Location: https://client.example.org/cb/example.com
?code=3GIJORjvgaEdu2u4KHyaQdGxfHDFsiViwGyZUxeBVrM
Seria outro caso em que o servidor de autorização determina que ele não vai emitir tokens para o cliente devido ao resultado do autenticação e confirmação anteriores. Nessa situação, o servidor de autorização tem que dizer ao cliente que a autorização fluxo é encerrado.
Authlete /auth/authorization/fail
A API suporta o processo de rescisão em termos de mensagens a serem enviadas ao cliente e método de transferência para a resposta.
Para resumir, um servidor de autenticação geralmente faz uma solicitação para qualquer um /auth/authorization/issue
ou /auth/authorization/fail
API dependendo do resultado da autenticação e consentimento do usuário.
Aqui assumimos que o agente de usuário recebe o formulário de resposta de redirecionamento do servidor de autorização. Ele enviaria a seguinte solicitação (dobrada para legibilidade) ao cliente (mensagem #11).
GET /cb/example.com?code=3GIJORjvgaEdu2u4KHyaQdGxfHDFsiViwGyZUxeBVrM HTTP/1.1
Host: client.example.org
O cliente iria extrair o valor do code
parâmetro, crie uma solicitação de token com o valor e envie-o para o servidor de autorização da seguinte forma (dobrado para legibilidade). https://as.example.com/token
é o token endpoint URI neste tutorial (mensagem #12).
POST /token HTTP/1.1
Host: as.example.com
Authorization: Basic base64(12818600553323:-olDIKD9BihRfB8O1JxobUEKBZ7PIV5Z6oaqxAshmoUtUZgB-wjmmxTYDiDV6vM_Mgl267PeNrRftq8cWplvmg)
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=3GIJORjvgaEdu2u4KHyaQdGxfHDFsiViwGyZUxeBVrM
&redirect_uri=https://client.example.org/cb/example.com
O servidor de autorização deve avaliar parâmetros na solicitação, fazer uma resposta de token de volta ao cliente.
Neste tutorial, vamos usar Authlete /auth/token
API para avaliar a solicitação e criar a resposta.
Execute curl command as follows (message #13). Make sure to replace API Key
, API Secret
, Client ID
, Client Secret
and Code
by your own values generated in the previous steps.
curl -s -X POST https://api.authlete.com/api/auth/token \
-u '<API Key e.g. 10723797812772>:<API Secret e.g. ekYoYTI84qZcpe6bXGzDwduQ1fGBYxJT8K8Tnwd7poc>' \
-H 'Content-Type: application/json' \
-d '{ "clientId": "<Client ID e.g. 12800697055611>", "clientSecret": "<Client Secret e.g. dcDHEXr_tXNi7QdIMXLSXpXAy_j7Cr4C4LT2xAukQcW_09E2Ag1jTBdwpQrG-HBxflPF4Bz_Nb9Zd_ySAxOs6A>", "parameters": "grant_type=authorization_code&code=<Code e.g. GrYz5vtk6VaF0jxfnDrB2yvmk4deIrnMkrGT07JdM5U>&redirect_uri=https://client.example.org/cb/example.com" }'
Execute curl.exe as follows (message #13).Make sure to replace API Key
, API Secret
, Client ID
, Client Secret
and Code
by your own values generated in the previous steps.
curl.exe -s -X POST https://api.authlete.com/api/auth/token `
-u '<API Key e.g. 10723797812772>:<API Secret e.g. ekYoYTI84qZcpe6bXGzDwduQ1fGBYxJT8K8Tnwd7poc>' `
-H 'Content-Type: application/json' `
-d '{ \"clientId\": \"<Client ID e.g. 12800697055611>\", \"clientSecret\": \"<Client Secret e.g. dcDHEXr_tXNi7QdIMXLSXpXAy_j7Cr4C4LT2xAukQcW_09E2Ag1jTBdwpQrG-HBxflPF4Bz_Nb9Zd_ySAxOs6A>\", \"parameters\": \"grant_type=authorization_code&code=<Code e.g. GrYz5vtk6VaF0jxfnDrB2yvmk4deIrnMkrGT07JdM5U>&redirect_uri=https://client.example.org/cb/example.com\" }'
Se a solicitação for apropriada, Authlete faz a seguinte resposta (mensagem #14).
{
"accessTokenExpiresAt" : 1558627889220,
"refreshTokenDuration" : 864000,
"clientId" : 12818600553323,
"accessToken" : "-g5ZJDAfpTQAqR9mdnAfhv0zuCe3SUrKJ2_859zI1Ow",
"refreshToken" : "4PwVTovcwMgnNJbsH-BzeQj5a8nelOi0iEIswex-ueE",
"accessTokenDuration" : 86400,
"clientIdAliasUsed" : false,
"refreshTokenExpiresAt" : 1559405489220,
"grantType" : "AUTHORIZATION_CODE",
"subject" : "testuser01",
"action" : "OK",
"responseContent" : "{\"access_token\":\"-g5ZJDAfpTQAqR9mdnAfhv0zuCe3SUrKJ2_859zI1Ow\",\"refresh_token\":\"4PwVTovcwMgnNJbsH-BzeQj5a8nelOi0iEIswex-ueE\",\"scope\":null,\"token_type\":\"Bearer\",\"expires_in\":86400}",
"resultCode" : "A050001",
"type" : "tokenResponse",
"resultMessage" : "[A050001] The token request (grant_type=authorization_code) was processed successfully."
}
Preste atenção a três pares de teclas/valores na resposta; resultMessage
, action
e responseContent
.
resultMessage
fornece resultado legível por humanos do processamento da solicitação. (Veja também Interpretando os códigos de resultado da Authlete)action
indica o que o servidor de autorização deve fazer em seguida. O valor nesta resposta é OK
, o que significa que o servidor de autorização deve fazer uma resposta de token de volta ao cliente.responseContent
é suposto ser o conteúdo da resposta do servidor de autorização.Espera-se que o servidor de autorização faça a seguinte resposta ao cliente (mensagem nº 15).
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token":"-g5ZJDAfpTQAqR9mdnAfhv0zuCe3SUrKJ2_859zI1Ow",
"refresh_token":"4PwVTovcwMgnNJbsH-BzeQj5a8nelOi0iEIswex-ueE",
"scope":null,
"token_type":"Bearer",
"expires_in":86400
}
Finalmente, o servidor de autorização criou com sucesso os tokens e forneceu-os ao cliente. Ao aproveitar as APIs da Authlete, o servidor de autorização não precisa implementar lógica complicada para avaliar paramters na solicitação de autorização/token, e fazer respostas adequadas para essas solicitações com o método correto.
Na maioria dos casos, o cliente faria uma solicitação com o token de acesso ao servidor de recursos que fornece APIs (mensagem #16).
O servidor de recursos deve avaliar a validade do token, recuperar informações sobre o usuário e o cliente relacionados ao token e determinar como responder à solicitação de API.
Authlete fornece /auth/introspection
API para tal propósito. Ele verifica a validade do token e fornece as informações acima.
Certifique-se de substituir <API Key>
, <API Secret>
e <Token>
por seus próprios valores gerados na etapa anterior.
Execute curl command as follows (message #13). Make sure to replace API Key
, API Secret
and Token
by your own values generated in the previous steps.
curl -s -X POST https://api.authlete.com/api/auth/introspection \
-u '<API Key e.g. 10723797812772>:<API Secret e.g. ekYoYTI84qZcpe6bXGzDwduQ1fGBYxJT8K8Tnwd7poc>' \
-H 'Content-Type: application/json' \
-d '{ "token": "<Token e.g. 7FfwOnGjVHwxXhs2Wr67XV1-ZhQaoy3ctKcGkLyKxuY>" }'
Execute curl.exe as follows (message #13). Make sure to replace API Key
, API Secret
and Token
by your own values generated in the previous steps.
curl.exe -s -X POST https://api.authlete.com/api/auth/introspection `
-u '<API Key e.g. 10723797812772>:<API Secret e.g. ekYoYTI84qZcpe6bXGzDwduQ1fGBYxJT8K8Tnwd7poc>' `
-H 'Content-Type: application/json' `
-d '{ \"token\": \"<Token e.g. 7FfwOnGjVHwxXhs2Wr67XV1-ZhQaoy3ctKcGkLyKxuY>\" }'
Se a solicitação for apropriada, Authlete faz a seguinte resposta (mensagem #18).
{
"resultMessage" : "[A056001] The access token is valid.",
"refreshable" : true,
"clientIdAliasUsed" : false,
"existent" : true,
"resultCode" : "A056001",
"expiresAt" : 1558627889000,
"responseContent" : "Bearer error=\"invalid_request\"",
"clientId" : 12818600553323,
"action" : "OK",
"usable" : true,
"sufficient" : true,
"subject" : "testuser01",
"type" : "introspectionResponse"
}
O servidor de recursos seria capaz de encontrar um monte de informações, como
prazo de validade do token (expiresAt
), identificador do usuário
que aprovaram o acesso (subject
), identificador do cliente
(clientId
). Então é suposto determinar como responder ao
Solicitação de API (mensagem nº 19).
Neste tutorial, pudemos confirmar como usar APIs Authlete para implementar o fluxo de concessão de código de autorização no servidor de autorização.
Vamos nos aprofundar em Authlete jogando com as seguintes características.
/auth/authorization/fail
API (Veja Gerando resposta de erro com API “fail”)