-
Notifications
You must be signed in to change notification settings - Fork 1
/
nativeFlow.puml
93 lines (80 loc) · 3 KB
/
nativeFlow.puml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
@startuml
title Authorization Code Flow for Native Apps
actor "Resource-owner" as user
participant userAgent [
=User-Agent
----
""Mobile Phone""
]
participant app [
=Client
----
""Native App""
]
participant oAuthServer [
=Authorization Server
]
participant api [
=Resource Server
----
""API""
]
autonumber
user -> userAgent: Utiliza seu dispositivo
userAgent -> app: para acessar a aplicação
app -> app: Gera o Code Verifier (code_verifier)
app -> app: Gera o hash do Code Verifier (code_challenge)
app -> userAgent: "Pede" ao User-Agent para realizar a requisição\n ao Authorization Server incluindo\n o code_challenge, escopos, etc.
userAgent -> oAuthServer: Inicia requisição do fluxo de autorização. (É comum nesse passo o User-Agent executar um browser)
note left: Front-channel
note left of oAuthServer #aqua
""GET https://authorization-server.com/authorize?""
"" response_type=**code**&""
"" client_id=<<CLIENT_ID_HERE>>&""
"" redirect_uri=https://example-app.com/redirect&""
"" scope=<<SCOPES_LIST_HERE>>&""
"" state=abcde&"" o que fizer mais sentido para o negócio
"" code_challenge=base64url(sha256(code_verifier))&""
"" code_challenge_method=S256""
end note
oAuthServer -> user: Apresenta uma tela de login
user -> oAuthServer: Fornece suas credencias para fazer o login
oAuthServer -> user: Pede o consentimento do usuário para logar na aplicação em questão
user -> oAuthServer: Confirma seu desejo de fazer o login
oAuthServer -> oAuthServer: Guarda o Code Challenge
oAuthServer -> userAgent: Eis o Authorization Code gerado
note left: Front-channel
note right of userAgent #aqua
""HTTP/1.1 302 Found""
""Location: https://example-app.com/redirect?""
"" code=<<GENERATED_CODE>>""
"" state=abcde""
end note
userAgent -> app: Eis o Authorization Code gerado\n no Authorization Server
app -> oAuthServer: Eis o Authorization Code, eu gostaria de trocá-lo\n por um Access Token. Aqui está também o\n Code Verifier.\n Perceba que não é enviado um client_secret
note left: Back-channel
note left of oAuthServer #aqua
""POST https://authorization-server.com/token""
""Content-Type: application/x-www-form-urlencoded""
""grant_type=**authorization_code**&""
""code=<<GENERATED_CODE_HERE>>&""
""redirect_uri=https://example-app.com/redirect&""
""code_verifier=<<CODE_VERIFIER_HERE>>&""
""client_id=<<CLIENT_ID_HERE>>""
end note
oAuthServer -> oAuthServer: Calcula o Code Challenge\n a partir do Code Verifier recebido\n para ver se é o mesmo do início\n do fluxo
oAuthServer -> app: Aqui está um Access Token e Refresh Token)
note left: Back-channel
note right of app #aqua
""HTTP/1.1 200 OK""
""Content-Type: application/json""
""{""
"" "token_type": "Bearer", ""
"" "access_token": "jasfhasf123477234RAs", ""
"" "expires_in": 3600, ""
"" "scope": "<REQUESTED_LIST_HERE>", ""
"" "refresh_token": "HSjafyy12344" ""
""}""
end note
app -> api: Gostaria de consumir os recursos protegidos. Eis o Access Token.
@enduml