OAuth 2.0
Fluxo Authorization Code
Implemente com segurança a autorização, PKCE, a troca de código, a renovação e o encerramento de sessão.
1. Gerar os valores da transação
Para cada tentativa de login, gere:
- um valor
statede alta entropia para associar o pedido ao callback - um valor
noncepara associar as informações de identidade ao pedido - um
code_verifier - PKCE de alta entropia e um
code_challenge, calculado como o resumo SHA-256 do verifier codificado em base64url
Guarde os valores numa transação de curta duração protegida no servidor.
2. Redirecionar para a autorização
GET /oauth2/authorize? response_type=code& client_id=YOUR_CLIENT_ID& redirect_uri=https%3A%2F%2Fexample.com%2Fauth%2Fdocid%2Fcallback& scope=openid%20profile%20email& state=RANDOM_STATE& nonce=RANDOM_NONCE& code_challenge=PKCE_CHALLENGE& code_challenge_method=S2563. Validar o callback
Um callback bem-sucedido contém code e state. Compare state com o valor guardado, utilizando uma comparação de tempo constante sempre que possível. Rejeite transações ausentes, reutilizadas, expiradas ou não correspondentes.
Um callback sem sucesso contém error e pode conter error_description. Registe apenas um identificador de correlação interno seguro e apresente ao utilizador uma mensagem clara que permita tentar novamente.
4. Trocar o código
Envie um pedido de formulário de servidor para servidor:
POST /oauth2/tokenContent-Type: application/x-www-form-urlencodedAuthorization: Basic BASE64_CLIENT_ID_AND_SECRET grant_type=authorization_code&code=RETURNED_CODE&redirect_uri=https%3A%2F%2Fexample.com%2Fauth%2Fdocid%2Fcallback&code_verifier=ORIGINAL_PKCE_VERIFIERAs credenciais do cliente também podem ser aceites no corpo do formulário quando essa opção estiver configurada, mas HTTP Basic mantém as credenciais separadas dos parâmetros do grant.
5. Obter as informações do utilizador
GET /oauth2/userinfoAuthorization: Bearer ACCESS_TOKENUtilize a resposta para criar uma sessão local no site e, em seguida, elimine a transação OAuth de utilização única.
Renovar e revogar
Troque um refresh token válido com grant_type=refresh_token em /oauth2/token. Guarde os refresh tokens apenas no servidor. Quando a integração já não precisar de um token, revogue-o em /oauth2/revoke e invalide a sessão local.