隨手扎
【用Keycloak學習身份驗證與授權12】Flows這一小段路上路前注意事項
其實我原本是想要 RESTer 幹到底的哈😜。
今天有一點是插話的。考慮到接下來幾天的內容,所使用到的工具會有點多樣,所以行前做個提醒。
首先,你最好了解:
- HTTP Request / Response
- HTTP API (Web API)
- JSON
- BASE64
諾對於Postman這類工具有所熟悉再好不過。但接者幾天會使用:
- RESTer
- curl
有一些情況會直接使用。 - python
主要用於格式化JSON。
除此之外,如果熟悉Bash
的話同樣也有助於理解所有內容。此外還有可能會使用到 OAuth Tools 、 jwt.io 。(JWT的部分更有可能出現在之後關於Open-Id內容前後)
但其實,以上並非全部都是必須。最重要的是希望你能夠學習到OAuth本身的部分。
首先,起初的OAuth設計是基於HTTP的,但其實有相當多細節有多種方式實現。
接者,除了之前提到的客戶端、資源擁有者、受保護的資源(資源伺服器)外和授權伺服器外,客戶端又將拆分成前端客戶端與後端客戶端。 通常前端客戶端指的是瀏覽器;而後端客戶端是實際需要取得存取權杖(Access Token)的服務程式,通常也意味著其實是需要受保護的資源。 前端與後端有可能其實就是同一支程式;還有可能是不同程式外,更可以是沒有直接關係的程式。簡單整理一下:
- 資源擁有者/取用者:
實際擁有資源,或已經擁有授權的使用者。在系統上是用戶帳號,但通常指自然人。 - 前端客戶端:
要求用戶進行驗證授權。通常為瀏覽器。 - 後端客戶端:
實際執行業務邏輯、提供服務。需要取得存取權杖(Access Token),進而存取受保護的資源。 - 資源伺服器:
管理、保護需受保護資源。 - 驗證/授權伺服器:
驗證資源擁有者,並提供存取權杖授權給客戶端。
而通常的行為流程如下:
actor User
archimate #Technology Browser <<technology-device>>
rectangle #Application Client
rectangle #Application Authorization
rectangle #Application "Resource Server" as Resource
database #Physical "Resource\nDatabase" as DB
User -> Browser: 1. login
Browser -> Authorization: 2. authentication
Authorization --> Client: 3. access token
Resource <--> Client: 4. get resource
Resource <--> DB
Client -> Browser: 5. provide service
- 資源擁有者 透過瀏覽器登入
- 授權伺服器 驗證身分並確認授權
- 授權給客戶端
- 客戶端 取得受保護資源
- 客戶端 提供 資源擁有者 服務
RFC 6749的圖:
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+
Figure 1: Abstract Protocol Flow