本系列文之後也會置於個人網站
首先,先來看看直接使用帳號密碼授權的。
是的, OAuth 是有一個模式支援直接使用帳號密碼的。與萬能鑰匙不太一樣的是,授權的結果仍然是由授權伺服器的權杖和資源伺服器決定。儘管透過中央授權控制可以限制存取權杖可以做些什麼,但畢竟直接使用帳號密碼並不是特別好,故在其他模式下都不適用時,才應該再考慮此模式。
+----------+
| Resource |
| Owner |
| |
+----------+
v
| Resource Owner
(A) Password Credentials
|
v
+---------+ +---------------+
| |>--(B)---- Resource Owner ------->| |
| | Password Credentials | Authorization |
| Client | | Server |
| |<--(C)---- Access Token ---------<| |
| | (w/ Optional Refresh Token) | |
+---------+ +---------------+
Figure 5: Resource Owner Password Credentials Flow
首先先替瀏覽器安裝RESTer插件。Firefox和Chrome都可以找得到。至於其他瀏覽器就要自己找找看或使用Postmam、Curl之類的工具。
先前建立的my-quick-start-app
並不支援這個模式,主要是因爲開啓了Consent Required
。上面說道password模式主要授權方式爲中央授權控制,也就是前幾天提到的白名單。而my-quick-start-app
建立的是灰名單的客戶端。所以我們得在建立一個,就叫flow-experiment-1
吧!
然後Consent Required
維持禁用;Direct Access Grants Enabled
維持啓用
開啓RESTer並依下圖填入資訊。
(使用POST方法打endpoint - http://localhost:8080/auth/realms/quick-start/protocol/openid-connect/token )
此外Content-Type
必須是application/x-www-form-urlencoded
。在之後幾個模式都是如此,也就不會再特別提及。
最後填上我們要使用的模式、帳號/密碼、要授權的客戶端和需要的授權範圍。
password
bob
password
flow-experiment-1
email profile
如果你使用Curl,可以透過以下命令執行:
curl -X POST http://localhost:8080/auth/realms/quick-start/protocol/openid-connect/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=password&username=bob&password=password&client_id=flow-experiment-1'
最後就會得到以下結果
對於結果,目前只會簡單說明三個部分access_token
、refresh_token
、token_type
。
關於access_token
應該也不用太說什麼,它就是資源伺服器會認的權杖。在取用資源時會需要同時給資源伺服器做驗證授權。此外,OAuth並沒有特別說明存取權杖的格式,而這裡的格式是之後會介紹的JWT。token_type
則說明了這是一個Bearer
權杖,需要使用Bearer
的方式進行驗證授權。更詳細部分之後才會提到。
然後是refresh_token
。這個返回值是可選的,授權伺服器可能不會返回其值。除了有可能只允許此一次授權外,另一個原因是本身就可以使用帳號密碼的話,並不需要使用refresh_token
。如前所述,直接使用帳號密碼並不是特別好的方式,所以通常的做法應該只會使用一次帳號密碼,使用後客戶端會立刻忘記該資訊。之後就都使用refresh_token
,並使用之後同樣會提到的另一個模式 -- Refresh Token Flow 。