保哥出品 品質保證 OAuth2.0 - 02 認真堅持!
Tags: OAuth2.0
Bearer Token
-
三種方法
- Authorization Request Header Field
- Authorization:
Bearer
xxxxxxxxxxxxxx
- Authorization:
- Form-Encoded Body Parameter
- Content-Type: application/x-www-form-urlencoded
- access_token=xxxxxxxxxxxx
- URI Query Parameter 不建議拉!!!(以前單位好像這樣XDDD)
- GET /resource?
access_token
=mF_9.B5f-4.1JqM HTTP/1.1 - Cache-Control: private
- Cache-Control: no-store
- GET /resource?
- Authorization Request Header Field
- 資源提供者無法驗證 Bearer Token
- Response 要回應
WWW-Authenticate
標頭-
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example"
-
- 無效 or 過時的 Bearer Token
-
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example", error="invalid_token", error_description="The access token expired"
-
- Response 要回應
-
三種錯誤代碼
- invalid_request
- invalid_token
- insufficient_scope
Refresh Token (刷新權杖)
-
When Access Token
expired
oraccess new scope request
可以使用 Refresh Token -
重新核發
Access Token
原來Refresh Token
會 失效 -
授權伺服器 核發
Access Token
可同時回應一組Refresh Token
- 授權伺服器不一定要核發 Refresh Token 給
用戶端
- 授權伺服器不一定要核發 Refresh Token 給
JWT Token (iat, nbf, exp)
-
Say, you’re selling some API or resource. And a client purchased access that lasts for one hour and the access starts tomorrow in the midday.
-
So you issue a JWT with:
;iat
set to nownbf
set to tomorrow 12:00pmexp
set to tomorrow 1:00pm
安全性 & 方便性 永遠是天秤兩端!!!
OAuth 2.0 的 4 種授權流程
-
- 授權碼 Authorization Code Grant
- 適合
- client 位於 受信任 得環境 (大多是 Web 應用程式)
- 基本限制
- 透過 Browser 進行轉址
- 適合
- 隱含授權 Implicit Grant
- URL fragment
- 在 w3c 定義下 server 拿不到 url # 後面的資訊
- 適合
- client 位於 不受信任 的環境 (大多SPA應用程式)
- 基本限制
- 需透過 Browser 轉址
- 禁止核發 Refresh Token
- URL fragment
- 密碼認證 Resource Owner Password Credentials (ROPC) Grant
- 適合
- Resource Owner 與 Client 高度信任 的環境
- 適合
- 用戶端認證 Client Credentials Grant
- 適合
- 沒有 Resource Owner 可以介入授權的情境 (ex: 背景執行的服務)
- 適合
- 授權碼 Authorization Code Grant
-
自行擴充新的授權流程
- 裝置授權
- Device Authorization Grant (RFC 8628)
- 裝置授權
Device Code
Native App Authorization via an External User-Agent
-
Redirect URI options (APP 自己 call APP 拉!!)
- Private-Use Scheme Redirection
- 大部分行動應用程式或桌面應用程式都有支援註冊自訂的 URL Schemes
- Private-Use Scheme Redirection
OpendID Connect (OIDC)
- OIDC 1.0 基於 OAuth 2.0 的身份識別規範
- 提供 API 可以讓
用戶端
取得使用者
的基本個人資訊 (profile) - 允許 client 透過 OAuth2.0 取得 Access Token 一併取得 ID Token (使用者的識別資訊)
- 提供 API 可以讓
- 兩者的差異之處
- OAuth 2.0 主要著重在 Authorization
- OpenID Connect 著重在 Identity
-
主要腳色
- End User
- Identifier (ID)
- Relying Party (RP) (Client)
- OpenID Provider (OP)
- OpenID 主要運作流程
+--------+ +--------+
| | | |
| |---------(1) AuthN Request-------->| |
| | | |
| | +--------+ | |
| | | | | |
| | | End- |<--(2) AuthN & AuthZ-->| |
| | | User | | |
| RP | | | | OP |
| | +--------+ | |
| | | |
| |<--------(3) AuthN Response--------| |
| | | |
| |---------(4) UserInfo Request----->| |
| | | |
| |<--------(5) UserInfo Response-----| |
| | | |
+--------+ +--------+
關於 ID Token
關於 Claims
-
描述使用者 End User 的 識別資訊 (聲明資訊)
-
在身份驗證過程中 使用者透過 OAuth 2.0 決定 用戶端 可取得哪寫 Claims (識別資訊) (聲明資訊)
-
OpenID Connect : Standard Claims
- sub (Subject)
- name (End-User’s full name)
- email (End-User’s preferred e-mail address)
- gender (End-User’s gender) (female, male)
- locale (End-User’s locale)
-
ID Token 使用了以下 Claims
- 必要的 Claims
- iss (Issuer Identifier)
- sub (Subject identifier)
- aud (Audience)
- exp (Expiration time)
- iat (Issues At)
- 非必要 Claims
- auth_time
- nonce
- acr
- amr
- azp
- 必要的 Claims