日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SSO的通用标准OpenID Connect

發布時間:2024/2/28 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSO的通用标准OpenID Connect 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • OpenID Connect是什么
  • ID Token
  • 請求ID Token
  • ID Token可以做什么
  • Open Connect認證碼授權的例子
  • User Info

簡介

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

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

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

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

OpenID Connect是什么

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

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

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

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

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

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

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

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

  • 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的受眾。必須包含OAuth2的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種方式:

  • Authorization Code模式
  • Authorization Code流程的步驟如下:

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

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

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

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

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

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

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

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

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

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

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

    ID Token可以做什么

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

  • 無狀態session,通過將token存儲在瀏覽器的cookie中,我們可以實現輕量級的無狀態會話。
  • 服務器端不需要存儲會話信息,我們只需要在服務器端對token進行驗證即可。

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

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

  • Open Connect認證碼授權的例子

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

  • 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,否則將會彈出用戶登錄界面,讓用戶登錄。

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

    HTTP/1.1 302 Found Location: https://client.flydean.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=af0ifjsldkj
  • 使用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 czZCaGRSa3F0MzpnWDFmQmF0M2JWgrant_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.ewogImlzcyI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZfV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5NzAKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6qJp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJNqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7TpdQyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoSK5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4XUVrWOLrLl0nx7RkKU8NXNHq-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" }

    本文作者:flydean程序那些事

    本文鏈接:http://www.flydean.com/openid-connect-startup/

    本文來源:flydean的博客

    歡迎關注我的公眾號:「程序那些事」最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

    總結

    以上是生活随笔為你收集整理的SSO的通用标准OpenID Connect的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。