Fluxo PKCE
OAuth2
OAuth2: papéis
Resource owner
→ o dono dos dados
Resource server
→ onde os dados vivem
Authentication server
→ quem autentica pessoas e requisições
Client
→ o que o dono dos dados usa para acessar seus dados.
PKCE
Proof Key for Code Exchange
RFC 7636
Desenvolvidor para uso em "clientes abertos"
Onde
não tem como
esconder segredos.
Exemplo:
Mobile apps.
SPAs "sem backend" além do Resource Server.
https://blog.postman.com/pkce-oauth-how-to/
https://example.org/app/
Página não faz ideia de quem seja o usuário!
Cria um “
code verifier
“.
String aleatória [A-z0-9-._~] entre 43 e 128 bytes.
Cria um "
code challenge
".
base64(sha256(code_verifier))
Redireciona para o Authentication Server
https://example.com/auth-server/
?response_type=code
&client_id=<THIRD PARTY ID>
&redirect_uri=<URI>
&state=<STATE STRING>
&code_challenge=<CODE CHALLENGE>
&code_challenge_method=S265
https://example.com/auth-server/
Autentica o usuário, se precisar
Login:
Senha:
[Prosseguir]
Gera um authorization_code
Associa, internamente, o code_challenge ao authorization_code
Redireciona, novamente, para a página do terceiro:
https://example.org/app/
?authorization_code=<AUTHORIZATION CODE>
&state=<STATE STRING>
https://example.org/app/
Requisição POST ao Authentication Server
https://example.org/auth-server/
?grant_type=authorization_code
&code=<AUTHORIZATION CODE>
&redirect_uri=<REDIRECT URI (the same)>
&client_id=<CLIENT ID>
&code_verifier=<CODE VERIFIER>
https://example.com/auth-server/
Verifica se o <CODE VERIFIER> confere com o code_challenge.
Baseado justamente no authorization_code.
Que foi associado anteriormente.
Agora o Authentication Server
confia
no terceiro.
Responde à página do terceiro.
https://example.org/app/
BODY:
"id_token": <ID TOKEN>
"access_token": <ACCESS TOKEN>
https://example.org/app/
Usa-se os tokens para qualquer requisição ao Resource Server
Que pode ser completamente distinto do Authentication Server
O Resource Server, agora, confirma a autenticidade dos tokens enviados pelo Cliente por meio de requisições ao Authentication Server.
Para este último passo, o OAuth2 não provê nenhum padrão.
Depende de negociação prévia entre as partes.
Referências
https://www.oauth.com/oauth2-servers/pkce/authorization-request/
https://www.oauth.com/oauth2-servers/pkce/authorization-code-exchange/
https://espressocoder.com/2019/10/28/secure-your-spa-with-authorization-code-flow-with-pkce/
Made with Slides.com