天天看點

OIDC SSO - OAuth2.0的授權模式選擇

背景資訊

OIDC SSO相關文檔總共4篇,主要内容為對OIDC實作SSO登入流程時的各個細節和相關技術的闡述:1. 《OIDC SSO - OAuth2.0的授權模式選擇》
  1. OIDC SSO - 相關SSO流程和注意事項
  2. OIDC SSO - Discovery Mechanism
  3. OIDC SSO - 認證、簽名和加密等

基于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
OIDC SSO - OAuth2.0的授權模式選擇
OIDC SSO - OAuth2.0的授權模式選擇
應用類型 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,同時有效。

OIDC SSO - OAuth2.0的授權模式選擇

Authorization Code Flow 簡化版本

OIDC SSO - OAuth2.0的授權模式選擇

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

OIDC SSO - OAuth2.0的授權模式選擇
OIDC SSO - OAuth2.0的授權模式選擇

Implicit Flow - 隐式流

隐式流不支援傳回Refresh Token;

OIDC規範要求implicit flow中的Authentication request必須指定nonce;

OIDC SSO - OAuth2.0的授權模式選擇

Client Credential Flow

适用于M2M的純背景互動模式;

不支援傳回refresh token;

OIDC SSO - OAuth2.0的授權模式選擇

Resource Owner Password Flow - 密碼模式

IDaaS不支援這種模式

密碼模式适用于你既掌握應用程式又掌握應用所需資源的場景。密碼模式要求應用能夠安全存儲密鑰,并且能夠被信任地存儲資源所有者的賬密。一般常見于自家應用使用自家的資源。密碼模式不需要重定向跳轉,隻需要攜帶使用者賬密通路 Token 端點。

OIDC SSO - OAuth2.0的授權模式選擇

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
OIDC SSO - OAuth2.0的授權模式選擇
認證請求參數 類型 取值
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
OIDC SSO - OAuth2.0的授權模式選擇

其它重要資訊

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

參考資訊

  1. Okta官方文檔 - OAuth 2.0 and OpenID Connect Overview : https://developer.okta.com/docs/concepts/oauth-openid/#what-kind-of-client-are-you-building
  2. Authing官方文檔-選擇OAuth2授權模式:
  3. OIDC Core: https://openid.net/specs/openid-connect-core-1_0.html
  4. OAuth 2.0 Authorization Framework - RFC 6749: https://www.rfc-editor.org/rfc/pdfrfc/rfc6749.txt.pdf
  5. PKCE By OAuth 2.0 Client - RFC 7636: https://www.rfc-editor.org/rfc/pdfrfc/rfc7636.txt.pdf
  6. OAuth 2.0 Token Exchange - RFC 8693: https://datatracker.ietf.org/doc/html/rfc8693
  7. Delegation Patterns for OAuth 2.0 using Token Exchange :

繼續閱讀