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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebApi_基于Token的身份验证——JWT

發(fā)布時間:2025/6/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebApi_基于Token的身份验证——JWT 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

JWT是啥?

JWT就是一個字符串,經(jīng)過加密處理與校驗處理的字符串,形式為:

A.B.C

A由JWT頭部信息header加密得到
B由JWT用到的身份驗證信息json數(shù)據(jù)加密得到
C由A和B加密得到,是校驗部分

怎樣生成A?

header格式為:

[csharp] view plaincopy print?
  • {??
  • ????"typ":?"JWT",??
  • ????"alg":?"HS256"???
  • }??
  • {"typ": "JWT","alg": "HS256" }

      

    它就是一個json串,兩個字段是必須的,不能多也不能少。alg字段指定了生成C的算法,默認(rèn)值是HS256
    將header用base64加密,得到A
    通常,JWT庫中,可以把A部分固定寫死,用戶最多指定一個alg的取值

    怎樣計算B?

    根據(jù)JWT claim set[用base64]加密得到的。claim set是一個json數(shù)據(jù),是表明用戶身份的數(shù)據(jù),可自行指定字段很靈活,也有固定字段表示特定含義(但不一定要包含特定字段,只是推薦)。
    這里偷懶,直接用php中的代碼來表示claim set了,重在說明字段含義:

    [csharp] view plaincopy print?
  • $token?=?array(??
  • ????"iss"?=>?"http://example.org",???#非必須。issuer?請求實體,可以是發(fā)起請求的用戶的信息,也可是jwt的簽發(fā)者。??
  • ????"iat"?=>?1356999524,????????????????#非必須。issued?at。?token創(chuàng)建時間,unix時間戳格式??
  • ????"exp"?=>?"1548333419",????????????#非必須。expire?指定token的生命周期。unix時間戳格式??
  • ????"aud"?=>?"http://example.com",???#非必須。接收該JWT的一方。??
  • ????"sub"?=>?"jrocket@example.com",??#非必須。該JWT所面向的用戶??
  • ????"nbf"?=>?1357000000,???#?非必須。not?before。如果當(dāng)前時間在nbf里的時間之前,則Token不被接受;一般都會留一些余地,比如幾分鐘。??
  • ????"jti"?=>?'222we',?????#?非必須。JWT?ID。針對當(dāng)前token的唯一標(biāo)識??
  • ??
  • ????"GivenName"?=>?"Jonny",?#?自定義字段??
  • ????"Surname"?=>?"Rocket",??#?自定義字段??
  • ????"Email"?=>?"jrocket@example.com",?#?自定義字段??
  • ????"Role"?=>?["Manager",?"Project?Administrator"]?#?自定義字段??
  • );??
  • $token = array("iss" => "http://example.org", #非必須。issuer 請求實體,可以是發(fā)起請求的用戶的信息,也可是jwt的簽發(fā)者。"iat" => 1356999524, #非必須。issued at。 token創(chuàng)建時間,unix時間戳格式"exp" => "1548333419", #非必須。expire 指定token的生命周期。unix時間戳格式"aud" => "http://example.com", #非必須。接收該JWT的一方。"sub" => "jrocket@example.com", #非必須。該JWT所面向的用戶"nbf" => 1357000000, # 非必須。not before。如果當(dāng)前時間在nbf里的時間之前,則Token不被接受;一般都會留一些余地,比如幾分鐘。"jti" => '222we', # 非必須。JWT ID。針對當(dāng)前token的唯一標(biāo)識"GivenName" => "Jonny", # 自定義字段"Surname" => "Rocket", # 自定義字段"Email" => "jrocket@example.com", # 自定義字段"Role" => ["Manager", "Project Administrator"] # 自定義字段 );

      

    JWT遵循RFC7519,里面提到claim set的json數(shù)據(jù)中,自定義字段的key是一個string,value是一個json數(shù)據(jù)。因此隨意編寫吧,很靈活。

    個人初學(xué),認(rèn)為一個最基本最簡單最常用的claim set為:

    $token=array("user_id" => 123456, #用戶id,表明用戶"iat" => 1356999524, #token發(fā)布時間 "exp" => 1556999524, #token過期時間 );

    將claim set加密后得到B,學(xué)名payload

    怎樣計算C?

    將A.B使用HS256加密(其實是用header中指定的算法),當(dāng)然加密過程中還需要密鑰(自行指定的一個字符串)。
    加密得到C,學(xué)名signature,其實就是一個字符串。作用類似于CRC校驗,保證加密沒有問題。

    好了,現(xiàn)在A.B.C就是生成的token了。

    怎樣使用token?

    可以放到HTTP請求的請求頭中,通常是Authorization字段。
    也有人說放到cookie。不過移動端app用cookie似乎不方便。

    token應(yīng)用流程?

  • 初次登錄:用戶初次登錄,輸入用戶名密碼
  • 密碼驗證:服務(wù)器從數(shù)據(jù)庫取出用戶名和密碼進行驗證
  • 生成JWT:服務(wù)器端驗證通過,根據(jù)從數(shù)據(jù)庫返回的信息,以及預(yù)設(shè)規(guī)則,生成JWT
  • 返還JWT:服務(wù)器的HTTP RESPONSE中將JWT返還
  • 帶JWT的請求:以后客戶端發(fā)起請求,HTTP REQUEST HEADER中的Authorizatio字段都要有值,為JWT
  • 服務(wù)器端在處理到達的request之前,會將request中的Token值與保存在當(dāng)前用戶session中的令牌值進行比較,看是否匹配。在處理完該request后,且在response發(fā)送給客戶端之前,將會產(chǎn)生一個新的 Token,該Token除傳給客戶端以外,也會將用戶session中保存的舊的Token進行替換。這樣,如果用戶會退到剛才的提交頁面并再次提交的話,客戶端傳過來的Token值和服務(wù)器端的不一致,從而有效地防止了重復(fù)提交地發(fā)生。

    ?

    ?

    出處:https://blog.csdn.net/u010265681/article/details/76651765

    總結(jié)

    以上是生活随笔為你收集整理的WebApi_基于Token的身份验证——JWT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。