中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是SSO的通用標準OpenID Connect

發布時間:2021-10-21 16:18:41 來源:億速云 閱讀:212 作者:iii 欄目:編程語言

本篇內容介紹了“什么是SSO的通用標準OpenID Connect”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

簡介

OpenID Connect簡稱為OIDC,已成為Internet上單點登錄和身份管理的通用標準。 它在OAuth3上構建了一個身份層,是一個基于OAuth3協議的身份認證標準協議。

OAuth3實際上只做了授權,而OpenID Connect在授權的基礎上又加上了認證。

OIDC的優點是:簡單的基于JSON的身份令牌(JWT),并且完全兼容OAuth3協議。

今天我們將會介紹一下OIDC的具體原理。

OpenID Connect是什么

OpenID Connect發布于2014年,是建立在OAuth 2.0協議之上的簡單身份層,它允許客戶端基于授權服務器或身份提供商(IdP)進行的身份驗證來驗證最終用戶的身份,并獲得用戶的相關信息。

OpenID Connect提供了RESTful HTTP API,并使用Json作為數據的傳遞格式。

之前我們講到了基于XML格式的SAML協議,而OpenID Connect因為其更加簡潔的數據交換格式,被越來越多的應用使用,已經成為事實上的標準。

我們看一下OpenID connect的基本流程:

什么是SSO的通用標準OpenID Connect

  1. RP(client)發送一個認證請求到 OpenID Provider(OP)。

  2. OP對End User進行認證并獲得相應的授權。

  3. OP返回一個ID Token或者access Token給RP。

  4. RP使用access token向UserInfo Endpoint請求用戶信息。

  5. UserInfo Endpoint返回相應的用戶信息給RP。

ID Token

ID Token就像是一個用戶的身份證,它是以JWT格式存在的,并且由OP進行簽名,保證它的安全性。

獲取ID Token的方式就是向OP發送認證請求。

因為ID Token是以JWT格式存在的,JWT可以分為三個部分,分別是Header,Payload和Signature。

這里我們主要關注一下Payload的json內容:

{
  "sub"       : "alice",
  "iss"       : "https://openid.flydean.com",
  "aud"       : "client-12345",
  "nonce"     : "n-0S6_WzA2Mj",
  "auth_time" : 1311280969,
  "acr"       : "c2id.loa.hisec",
  "iat"       : 1311280970,
  "exp"       : 1311281970
}
  • sub = Subject Identifier:必須。iss提供的EU的唯一標識;最長為255個ASCII個字符;

  • iss = Issuer Identifier:必須。提供認證信息者的唯一標識。一般是Url的host+path部分;

  • aud = Audience(s):必須。標識ID-Token的受眾。必須包含OAuth3的client_id;

  • nonce:RP發送請求的時候提供的隨機字符串,用來減緩重放攻擊,也可以來關聯ID-Token和RP本身的Session信息。

  • auth_time = AuthenticationTime:EU完成認證的時間。如果RP發送認證請求的時候攜帶max_age的參數,則此Claim是必須的。

  • acr = Authentication Context Class Reference:可選。表示一個認證上下文引用值,可以用來標識認證上下文類。

  • iat = Issued At Time:必須。JWT的構建的時間。

  • exp = Expiration time:必須。ID-Token的過期時間;

上面的是ID Token的標準Claims。

請求ID Token

現在我們知道了ID Token是什么,那么在OpenID Connect的RP客戶端如何請求一個ID Token呢?

雖然OpenID Connect并未指定應如何實際驗證用戶身份,這取決于提供者來決定。但是我們通常由Web瀏覽器來執行認證步驟。

瀏覽器將用戶重定向到認證服務器的認證窗口,用戶輸入用戶名和密碼之后,通過OAuth 2.0協議請求ID token。

使用OAuth 2.0來獲取ID Token有3種方式:

  1. Authorization Code模式

什么是SSO的通用標準OpenID Connect

Authorization Code流程的步驟如下:

客戶端準備身份認證請求,請求里包含所需要的參數

客戶端發送請求到授權服務器

授權服務器對最紅用戶進行身份認證

授權服務得最終用戶的統一/授權

授權服務器把最終用戶發送回客戶端,同時帶著授權碼

客戶端使用授權碼向Token端點請求一個響應

客戶端接收到響應,響應的Body里面包含在和ID Token和Access Token

客戶端驗證ID Token,并獲得用戶的一些身份信息

  1. 隱式授權

什么是SSO的通用標準OpenID Connect

上圖就是一個隱式授權的例子,和Authorization Code模式不同的是,認證服務器返回的是一個access token片段,只有這個片段,我們是無法得到access token的。

這里我們需要額外請求一次client resource服務器,服務器將會返回一個script腳本,通過這個腳本,我們對access token片段進行解析,得到最終的access token。

  1. 混合模式

混合模式比較少用到,它是前面兩種模式的混合,它允許從前端和后端分別獲取token值。

ID Token可以做什么

那么我們拿到請求得到的ID Token可以做什么事情呢?

  1. 無狀態session,通過將token存儲在瀏覽器的cookie中,我們可以實現輕量級的無狀態會話。

服務器端不需要存儲會話信息,我們只需要在服務器端對token進行驗證即可。

  1. 可以將token傳遞給第三方,因為token本身并不是敏感信息,所以我們可以將token傳遞給其他應用程序或者后端服務。

  2. 令牌交互,我們可以通過ID Token去IdP服務器中請求access token,從而起到了交互token的目的。

Open Connect認證碼授權的例子

這里我們舉一個使用認證碼授權獲取到ID token的例子。

  1. RP通過重定向到OpenID Provider的OAuth 2.0認證終端,來初始化一個用戶認證。

下面是一個重定向的例子:

HTTP/1.1 302 Found
Location: https://openid.flydean.com/login?
          response_type=code
          &scope=openid
          &client_id=s6BhdRkqt3
          &state=af0ifjsldkj
          &redirect_uri=https%3A%2F%2Fclient.flydean.com%2Fcb
  • response_type:因為我們是認證碼模式,這里選擇code

  • scope:openid表示請求的是openid。

  • client_id:RP的client id,OP通過這個client_id來識別是否是可識別的RP。可以提前注冊或者提前約定。

  • state:RP生成的一個狀態標準,主要為了防止攻擊。

  • redirect_uri:認證完畢之后,跳轉的鏈接。

在OP端,將會檢測是否已經存在一個有效的用戶session,否則將會彈出用戶登錄界面,讓用戶登錄。

什么是SSO的通用標準OpenID Connect

登錄成功之后,client將會重定向到redirect_uri,并帶上認證碼:

HTTP/1.1 302 Found
Location: https://client.flydean.com/cb?
          code=SplxlOBeZQQYbYS6WxSbIA
          &state=af0ifjsldkj
  1. 使用code獲取ID token

上面返回的code只是一個中間產物,RP需要將code提交給OP換取ID token。

這次我們直接使用一個后端的POST請求:

POST /token HTTP/1.1
Host: openid.flydean.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

grant_type=authorization_code
 &code=SplxlOBeZQQYbYS6WxSbIA
 &redirect_uri=https%3A%2F%2Fclient.flydean.com%2Fcb
  • grant_type:authorization_code表示是授權碼格式

  • code就是上面一步獲得的code

  • redirect_uri是callback url

如果成功,OP會返回一個JSON對象,帶有ID token, access token 或者 refresh token:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{
  "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc
    yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
    NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
    fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
    AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
    Jp6IcmD3HP99Obi1PRs-cwh4LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
    NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
    QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS
    K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4
    XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg"
  "access_token": "SlAV32hkKG",
  "token_type": "Bearer",
  "expires_in": 3600,
}

其中ID token的格式是JWT。

User Info

我們獲取到的ID token里面已經包含了一些非常有用的claims信息。

事實上ID Token還可以包含其他的user info信息:

比如name,profile,picture,email,gender,birthdate,phone_number,address等等有用的信息。

我們可以在token請求的時候添加上額外的scope:

HTTP/1.1 302 Found
Location: https://openid.flydean.com/login?
          response_type=code
          &scope=openid%20email
          &client_id=s6BhdRkqt3
          &state=af0ifjsldkj
          &redirect_uri=https%3A%2F%2Fclient.flydean.com%2Fcb

比如上面的例子中,我們添加了額外的email信息,那么OP將會在token中加入email選項。

比如:

{
   "sub"                     : "alice",
   "email"                   : "alice@wonderland.net",
   "email_verified"          : true,
   "name"                    : "Alice Adams",
   "given_name"              : "Alice",
   "family_name"             : "Adams",
   "phone_number"            : "+86 18888888888",
   "profile"                 : "https://flydean.com/users/alice"
}

“什么是SSO的通用標準OpenID Connect”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福泉市| 西乌珠穆沁旗| 台江县| 扶风县| 日喀则市| 汶川县| 临湘市| 崇仁县| 鹤岗市| 资中县| 新余市| 乐都县| 柳江县| 蛟河市| 大方县| 喀喇沁旗| 察雅县| 宁城县| 沭阳县| 镇巴县| 方山县| 邳州市| 榆树市| 秦安县| 安龙县| 邵武市| 博兴县| 清徐县| 太原市| 油尖旺区| 丁青县| 崇义县| 轮台县| 社旗县| 西乌| 克东县| 吉林省| 鸡泽县| 论坛| 南澳县| 镇康县|