成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JWT原理和簡單應(yīng)用

tuantuan / 3277人閱讀

摘要:的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該也可直接被用于認(rèn)證,也可被加密。

JWT認(rèn)證登錄

最近在做一個審核系統(tǒng),后臺登錄用到JWT登錄認(rèn)證,在此主要做個總結(jié)

JWT是什么

Json web token (JWT), 根據(jù)官網(wǎng)的定義,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。

為什么使用JWT

此處主要和傳統(tǒng)的session作對比,傳統(tǒng)的session在服務(wù)器端需要保存一些登錄信息,通常是在內(nèi)存中,在后端服務(wù)器是集群等分布式的情況下,其他主機沒有保存這些信息,所以都需要通過一個固定的主機進(jìn)行驗證,如果用戶量大,在認(rèn)證這個點上容易形成瓶頸,是應(yīng)用不易拓展。

JWT原理

JWT由三個部分組成,用點號分割,看起來像是這樣,JWT token本身沒有空格換行等,下面是為了美觀處理了下

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19.
m0HD1SUd30TWKuDQImwjIl9a-oWJreG7tKVzuGVh7e4
1.頭部(Header)

Header部分是一個json,描述JWT的元數(shù)據(jù),通常是下面這樣

{
  "alg": "HS256",
  "typ": "JWT"
}

alg表示簽名使用的的算法,默認(rèn)是HMAC SHA256,寫成HS256, tye表示這個token的類型,JWT token統(tǒng)一使用JWT,上面這段Header生成的token是

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2.負(fù)載(Payload)

官方規(guī)定了7個字段,解釋如下

iss: 簽發(fā)人,可以填寫生成這個token的ID等等,可選參數(shù)

sub: 該JWT所面向的客戶,可以存儲用戶的account_id等等,可選

aud:該JWTtoken的接收方,可以填寫生成這個token的接口URL,但是不強制,可選

exp: 過期時間,時間戳,整數(shù),可選參數(shù)

iat:生成token的時間,unix時間,時間戳,可選參數(shù)

nbf(Not Before): 表示該token在此時間前不可用,驗證不通過的意思,可選

jti: JWT ID,主要用來生成一次性token,可選的參數(shù)

除了官方之外,我們還可以定義一部分自定義字段,但是考慮到BASE64是可逆的,所以不要放入敏感信息
下面是一個例子;

{
  "iss": "labs_purifier-api-panel",
  "iat": 1552975878,
  "exp": 1555567878,
  "aud": "http://ff-labs_purifier-api-test.fenda.io/prod/v1/auth/jwt",
  "sub": "1501385611884704",
  "scopes": [
    "register",
    "open",
    "login",
    "panel"
  ]
}

上面這個Payload,經(jīng)過BASE64加密后,生成的token是

eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19
3.簽名(Signature)

Signature是對前面兩部分生成的兩段token的加密,使用的加密方式是Header里面指定的,此處是HS256,此時,需要一個秘鑰,不可以泄露,大致過程如下:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
JWT的使用

JWT token 一般放在請求頭里面,當(dāng)然也可以放在cookie里面,但是放在cookie里面不可以跨域,例如:

Authorization: Bearer 
JWT在Python中的簡單生成和驗證

jwt庫

生成token

def create_token():
    payload={
              "iss": "labs_purifier-api-panel",
              "iat": 1552975878,
              "exp": 1555567878,
              "aud": Config.AUDIENCE,
              "sub": "1501385611884704",
              "scopes": [
                "register",
                "open",
                "login",
                "panel"
              ]
            }
    token = jwt.encode(payload, Config.SECRET_KEY, algorithm="HS256")
    return True, {"access_token": token}

驗證token

def verify_jwt_token(token):
    try:
        payload = jwt.decode(token, Config.SECRET_KEY,
                             audience=Config.AUDIENCE,
                             algorithms=["HS256"])
    except (ExpiredSignatureError, DecodeError):
        return False, token
    if payload:
        return True, jwt_model

需要注意的是,如果在生成的時候,加上了aud參數(shù),驗證的時候也要用上audience參數(shù),并且值必須一樣

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43462.html

相關(guān)文章

  • 關(guān)于 jwt 你應(yīng)該知道的事情

    摘要:頭部需要一個頭部,用于描述關(guān)于該的最基本的信息,例如其類型以及簽名所用的算法等。簽發(fā)者需要準(zhǔn)備一個可以確認(rèn)自己身份的字符串,這個字符串我們稱之為。 什么是 jwt ? JWT 全稱叫 JSON Web Token, 是一個非常輕巧的規(guī)范。這個規(guī)范允許我們使用 JWT 在用戶和服務(wù)器之間傳遞安全可靠的信息。 jwt 使用場景 jwt 用圖廣泛,例如授權(quán)、鑒權(quán)等。具體一點的話,假如我們有一...

    leone 評論0 收藏0
  • 帶你弄懂JWT原理

    摘要:的組成一個實際上就是一個字符串,它由三部分組成,頭部載荷與簽名。這個字符串我們將它稱作的載荷。注意是一種編碼,它是可以被翻譯回原來的樣子來的。這也可以被表示成一個對象。 JSON Web Token(JWT)是一個非常輕巧的規(guī)范。這個規(guī)范允許我們使用JWT在用戶和服務(wù)器之間傳遞安全可靠的信息。 讓我們來假想一下一個場景。在A用戶關(guān)注了B用戶的時候,系統(tǒng)發(fā)郵件給B用戶,并且附有一個鏈接點...

    animabear 評論0 收藏0
  • 手動實現(xiàn)一個jsonwebtoken

    摘要:利用消息認(rèn)證碼可以確保消息不是被別人偽造的,消息認(rèn)證碼是帶密鑰的函數(shù),由于有了一個,所以會比有更好的安全性。所以需要采用的就是算法,該算法主要利用的是不對稱加密算法,利用私鑰進(jìn)行簽名,公鑰驗證數(shù)據(jù)的完整性。 寫在前面 本文會到你了解jwt的實現(xiàn)原理,以及base64編碼的原理。同時本人也簡單的實現(xiàn)了一下jwt的生成,點這里。 jwt是什么 本質(zhì)上它是一段簽名的 JSON 格式的數(shù)據(jù)。由...

    zhangke3016 評論0 收藏0
  • 理解JWT(JSON Web Token)認(rèn)證及python實踐

    摘要:認(rèn)證服務(wù)器,即服務(wù)提供商專門用來處理認(rèn)證的服務(wù)器。它與認(rèn)證服務(wù)器,可以是同一臺服務(wù)器,也可以是不同的服務(wù)器。客戶端使用上一步獲得的授權(quán),向認(rèn)證服務(wù)器申請令牌。認(rèn)證服務(wù)器對客戶端進(jìn)行認(rèn)證以后,確認(rèn)無誤,同意發(fā)放令牌。 最近想做個小程序,需要用到授權(quán)認(rèn)證流程。以前項目都是用的 OAuth2 認(rèn)證,但是Sanic 使用OAuth2 不太方便,就想試一下 JWT 的認(rèn)證方式。這一篇主要內(nèi)容是 ...

    BigTomato 評論0 收藏0
  • Spring Security

    摘要:框架具有輕便,開源的優(yōu)點,所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實現(xiàn)身份驗證往期譯見系列文章在賬號分享中持續(xù)連載,敬請查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對身份進(jìn)行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...

    keelii 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<