iT邦幫忙

2021 iThome 鐵人賽

DAY 14
1
Software Development

用Keycloak學習身份驗證與授權系列 第 14

Day13 - 【概念篇】OAuth flows: Password Grant (Legacy)

本系列文之後也會置於個人網站


首先,先來看看直接使用帳號密碼授權的。

是的, 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

首先先替瀏覽器安裝RESTer插件。FirefoxChrome都可以找得到。至於其他瀏覽器就要自己找找看或使用Postmam、Curl之類的工具。

建立一個可以使用密碼模式的客戶端

先前建立的my-quick-start-app並不支援這個模式,主要是因爲開啓了Consent Required。上面說道password模式主要授權方式爲中央授權控制,也就是前幾天提到的白名單。而my-quick-start-app建立的是灰名單的客戶端。所以我們得在建立一個,就叫flow-experiment-1吧!

然後Consent Required維持禁用;Direct Access Grants Enabled維持啓用

透過RESTer與密碼模式取得存取權杖

開啓RESTer並依下圖填入資訊。
(使用POST方法打endpoint - http://localhost:8080/auth/realms/quick-start/protocol/openid-connect/token )

此外Content-Type必須是application/x-www-form-urlencoded。在之後幾個模式都是如此,也就不會再特別提及。

最後填上我們要使用的模式、帳號/密碼、要授權的客戶端和需要的授權範圍。

  • grant_type: password
  • username: bob
  • password: password
  • client_id: flow-experiment-1
  • scope: 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_tokenrefresh_tokentoken_type

關於access_token應該也不用太說什麼,它就是資源伺服器會認的權杖。在取用資源時會需要同時給資源伺服器做驗證授權。此外,OAuth並沒有特別說明存取權杖的格式,而這裡的格式是之後會介紹的JWT。token_type則說明了這是一個Bearer權杖,需要使用Bearer的方式進行驗證授權。更詳細部分之後才會提到。

然後是refresh_token。這個返回值是可選的,授權伺服器可能不會返回其值。除了有可能只允許此一次授權外,另一個原因是本身就可以使用帳號密碼的話,並不需要使用refresh_token。如前所述,直接使用帳號密碼並不是特別好的方式,所以通常的做法應該只會使用一次帳號密碼,使用後客戶端會立刻忘記該資訊。之後就都使用refresh_token,並使用之後同樣會提到的另一個模式 -- Refresh Token Flow

參考資料


上一篇
Day12 - 【概念篇】OAuth flows: flows這一小段路上路前注意事項
下一篇
Day14 - 【概念篇】OAuth flows: Implicit (Legacy)
系列文
用Keycloak學習身份驗證與授權33

尚未有邦友留言

立即登入留言