基於Token的認證和基於宣告的標識

2021-09-30 12:58:14 字數 2651 閱讀 5146

openid解決跨站點的認證問題,oauth解決跨站點的授權問題。認證和授權是密不可分的。而openid和oauth這兩套協議出自兩個不同的組織,協議上有相似和重合的之處,所以想將二者整合有些難度。好在openid connect作為openid的下一版本,在oauth 2.0的協議基礎上進行擴充套件,很好的解決了認證和授權的統一,給開發者帶來的便利。在學習和研究openid connect協議時,遇上兩個概念基於token的認證(token based authentication)和基於宣告的標識(claims based identity)。本文就這兩個概念展開討論,為了更好的理解openid connect協議的原理。

有兩種不同的方法實現服務端的認證

cookie-based auth vs token-based auth

相比cookie,基於token的認證有如下好處:

jwt是一種緊湊的url安全表示格式,適用於空格受限制的場景,比如http授權頭部和請求引數。jwt使用json格式表示一組宣告,該json被編碼成jws或jwe結構。

jwt是一段被base64url編碼過的字串行(去除了尾部的「=」),並用點號分隔。

下面是乙個jwt頭部的

view raw

headers.jsonhosted with ❤ by 

github

使用base64url編碼以後

eyjhbgcioiaisfmyntyilcaidhlwijogikpxvcj9

view raw

header_encodedhosted with ❤ by 

github

下面是乙個jwt的訊息體其中包含宣告集合

view raw

payload.jsonhosted with ❤ by 

github

使用base64url編碼以後

eyj1c2vyx2lkijogmx0

view raw

payload_encodedhosted with ❤ by 

github

將上面編碼過的jws頭部和jws訊息體使用hmac sha-256演算法,並結合私鑰計算得到的mac,再經過base64url編碼獲得的字串行成為jws簽名

bsf1w1blykcbxvlyotuogusozh2cly34xxypd8lqilq

view raw

signaturehosted with ❤ by 

github

將編碼過的頭部,訊息體和jws簽名通過』.『號連線起來,就獲得jwt

eyjhbgcioiaisfmyntyilcaidhlwijogikpxvcj9.eyj1c2vyx2lkijogmx0.bsf1w1blykcbxvlyotuogusozh2cly34xxypd8lqilq

view raw

jwthosted with ❤ by 

github

關於jwt的更多技術細節,請閱讀jwt規範.

cookie在請求和響應之間反覆傳遞,對於無狀態的http協議,在cookie裡加入乙個會話id,以標識一組請求和響應屬於同一會話。通常會話與使用者是多對一關係,也就是說乙個會話只會屬於乙個使用者。所以通過cookie技術就可以標識出使用者。通常cookie裡也會攜帶一些額外的資訊,但是考慮cookie容易被截獲和篡改,所以cookie裡並不適合放置使用者的基本資訊。

token其實和cookie類似是一段序列化字串,作為http請求頭的一部分,傳送到服務端。但是token加入了簽名機制,可以防篡改。所以token可以包含使用者資訊傳送給不同域的應用服務作為身份標識,只要相應的應用服務能識別其有效性。

token僅僅是某種資訊的承載形式,基於token的認證有乙個更寬泛的概念:基於宣告的標識

claims based identity

基於宣告的標識其實無處不在,舉個我們很熟悉的例子。

每次機場登機前過安檢時,你不能簡單地走到門口,並出示身份證。相反,必須先辦理登機手續櫃檯。如果出國,還需要出示護照。安檢人員先驗證證件頭像與你本人是否一致,然後核實您的資訊,並確認您已經購買了機票。假設一切順利,您將獲得登機牌。

登機牌上包括知道您的姓名,航班號和座位號等常規資訊。安檢人員可以從登機牌上獲得足夠的資訊以配合他們的工作。

登機牌上還有一些特殊資訊,包含在條形碼和背面的磁條裡,以證明該登機牌是由航空公司簽發的,而不是偽造的。

從本質上說,登機牌是乙個由航空公司簽發的關於你的一組資訊。它表明你被允許某時登上某飛機坐在某個座位。當然,安檢人員不必深入地理解這些。他們只需驗證您的登機牌,讀取其中的資訊,然後讓你登機。

登機牌就是一張包含了一組宣告資訊的卡片,是token的一種實體形式。

《a guide to claims-based identity and access control》

introduction to oauth2: json web tokens

give me a jwt, i』ll give you an access token

claims-based identity

cookies vs tokens. getting auth right with angular.js

auth with json web tokens

json web token (jwt) draft-jones-json-web-token-07

基於JJWT的Token認證機制

基於jwt的token認證機制 使用者登陸之後,在後台根據使用者名稱 密碼 時間戳 使用者角色等資訊 根據業務需求,看哪些字段可以滿足要求 生成token。最終返回給前端token以及加密鹽 該加密鹽可隨機生成 前端在請求資料介面的時候,帶上token字串以及加密鹽傳到後台,後台解析出token中的...

基於token認證的JWT方案

後端校驗使用者名稱密碼,生成token返回給前端,有時也會儲存token到使用者表或者儲存到全域性map中 toekn的生成規則一般是base64 uid md5 u pwd secret 前端拿到token之後,儲存到localstrage中 前端再請求的時候要把token放到header來過來 ...

nodejs基於Token的身份認證

起初的驗證方式是存在於伺服器的,使用者登入進來以後,伺服器判斷成功,將資料存進session裡面,向使用者返回乙個sessionid。這樣的弊端是,假如使用者基數特別大,每登入乙個使用者,就要儲存一條,對伺服器的記憶體壓力比較大。基於token的驗證方法是無狀態的,因此我們就不用把資訊存在伺服器中了...