背景資訊
OIDC SSO相關文檔總共4篇,主要内容為對OIDC實作SSO登入流程時的各個細節和相關技術的闡述:1. 《OIDC SSO - OAuth2.0的授權模式選擇》
基于OIDC實作SSO時,可以選擇不同的OAuth2授權流來完成整個SSO流程。
本文檔對其進行了總結,其中大部分内容從
Okta官方文檔和
Authing官方文檔翻譯而來,然後增加了部分自己認為重要的提示知識。
引用連結:
https://docs.authing.cn/v2/concepts/oidc/choose-flow.html https://developer.okta.com/docs/concepts/oauth-openid/#is-your-client-a-spa-or-native![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
應用類型 | OAuth2 流 |
---|---|
Server-side Application | Authorization Code Flow |
Single-Page Application | Authorization Code Flow with PKCE or Implicit Flow |
Native Application | Authorization Code Flow with PKCE |
Trusted | Resource Owner Password Flow |
Server | Client Credentials |
語雀文檔格式更好看一點: https://yuque.antfin.com/docs/share/bf4b2431-bfaa-42e4-aaeb-b581ec454b40?# 《OIDC SSO - OAuth 2.0 Authorization Framework》
OAuth2各個流時序圖說明
Authorization Code Flow - 授權碼流
Authorization Code流支援傳回id token、refresh token;
如果Response type是code+token,這種直接傳回的access token和code來換取的access token,同時有效。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
Authorization Code Flow 簡化版本
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
Authorization Code With PKCE Flow增強
具體參考Okta Blog:
https://developer.okta.com/blog/2019/08/22/okta-authjs-pkce推薦使用者用Authorization Code With PKCE Flow 而不是Implicit Flow
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
Implicit Flow - 隐式流
隐式流不支援傳回Refresh Token;
OIDC規範要求implicit flow中的Authentication request必須指定nonce;
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
Client Credential Flow
适用于M2M的純背景互動模式;
不支援傳回refresh token;
Resource Owner Password Flow - 密碼模式
IDaaS不支援這種模式
密碼模式适用于你既掌握應用程式又掌握應用所需資源的場景。密碼模式要求應用能夠安全存儲密鑰,并且能夠被信任地存儲資源所有者的賬密。一般常見于自家應用使用自家的資源。密碼模式不需要重定向跳轉,隻需要攜帶使用者賬密通路 Token 端點。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
OAuth 2.0 Token Exchange - Client Credential Based
RFC-8693: OAuth 2.0 Token Exchange
允許一個Client通過扮演終端使用者角色身份方式擷取access_token(類似阿裡雲RAM角色扮演)。
通俗來講就是一個Client A 扮演 User B通路 Service C;另外OAuth 2.0 STS同時支援扮演和委托,取決于是否存在actor_token。
STS解決的問題舉例:
https://www.scottbrady91.com/oauth/delegation-patterns-for-oauth-20
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
認證請求參數 | 類型 | 取值 |
---|---|---|
grant_type | REQUIRED | urn:ietf:params:oauth:grant-type:token-exchange |
resource | OPTIONAL | 要通路的Resource,認證服務能夠映射成resource uri |
audience | 代表這次security token的邏輯名字 | |
scope | 授權通路範圍 | |
requested_token_type | token類型,見下表 | |
subject_token | 要扮演的使用者實體身份辨別 | |
subject_token_type | ||
actor_token | 扮演使用者實體身份的參與者辨別 | |
actor_token_type |
認證傳回參數 | ||
---|---|---|
access_token | ||
issued_token_type | 簽名的security token辨別 urn:ietf:params:oauth:token-type:access_token | |
token_type | 這次簽發的access_token怎麼使用 | |
expires_in | RECOMMENDED | 過期時間 機關second |
refresh_token | 重新整理token |
上述Token type可選的取值 |
---|
urn:ietf:params:oauth:token-type:refresh_token |
urn:ietf:params:oauth:token-type:id_token |
urn:ietf:params:oauth:token-type:saml1 |
urn:ietf:params:oauth:token-type:saml2 |
urn:ietf:params:oauth:token-type:jwt |
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY4MjY4IWN4QDO0UWL0AzNh1iMxYGNtQ2YxgTLwEDOyYDZmFTL1ETO5ADN4cjM1QTNx8CXxQTMvw1ZuB3LchTMwIzLcBzLctmchx2Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
其它重要資訊
Hybrid Flow
This section describes how to perform authentication using the Hybrid Flow. When using the Hybrid Flow, some tokens are returned from the Authorization Endpoint and others are returned from the Token Endpoint. The mechanisms for returning tokens in the Hybrid Flow are specified in
OAuth 2.0 Multiple Response Type Encoding Practices[OAuth.Responses].
也就是在一次授權流中可以支援即傳回code,也傳回access_token和id_token資料;具體可以看下response type在三種授權流中的value可選值;
OIDC中三種流支援的各個特性表格
特性 | Authorization Coed Flow | Implicit Flow | |
---|---|---|---|
All tokens returned from Authorization Endpoint 所有token全部從授權端點傳回 | yes | ||
All tokens returned from Token Endpoint 所有token全部從token端點傳回 | |||
Tokens not revealed to User Agent token不會在使用者前端暴露 | |||
Client can be authenticated 用戶端可以被認證 | |||
Refresh Token possible 能不能拿到Refresh Token | |||
Communication in one round trip 一次互動完成通信 | |||
Most communication server-to-server 大部分的通信都是伺服器對伺服器 | varies |
OIDC中三種流中支援的response type
多response type定義規範:
https://openid.net/specs/oauth-v2-multiple-response-types-1_0.html"response type" value | |||
---|---|---|---|
code | |||
id_token | |||
id_token token | |||
code id_token | |||
code token | |||
code id_token token |
參考資訊
- Okta官方文檔 - OAuth 2.0 and OpenID Connect Overview : https://developer.okta.com/docs/concepts/oauth-openid/#what-kind-of-client-are-you-building
- Authing官方文檔-選擇OAuth2授權模式:
- OIDC Core: https://openid.net/specs/openid-connect-core-1_0.html
- OAuth 2.0 Authorization Framework - RFC 6749: https://www.rfc-editor.org/rfc/pdfrfc/rfc6749.txt.pdf
- PKCE By OAuth 2.0 Client - RFC 7636: https://www.rfc-editor.org/rfc/pdfrfc/rfc7636.txt.pdf
- OAuth 2.0 Token Exchange - RFC 8693: https://datatracker.ietf.org/doc/html/rfc8693
- Delegation Patterns for OAuth 2.0 using Token Exchange :