在nodejs中,jwt全名為Json web token,是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準。 JWT的聲明一般被用來在身分提供者和服務提供者間傳遞被認證的使用者身分訊息,以便於從資源伺服器取得資源。
本教學操作環境:windows7系統、nodejs 12.19.0版,DELL G3電腦。
nodejs中什麼是JWT
#Json web token (JWT), 是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準((RFC 7519)。該token被設計為緊湊且安全的,特別適用於分佈式站點的單點登錄(SSO)場景。
JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源伺服器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可加密。
我們知道HTTP通訊是無狀態的,因此客戶端的請求到了服務端處理完之後是無法返回給原來的客戶端。因此需要對存取的客戶端進行識別,常用的做法是透過session機制:客戶端在服務端登陸成功之後,服務端會產生一個sessionID,返回給客戶端,客戶端將sessionID儲存到cookie中,再次發起請求的時候,攜帶cookie中的sessionID到服務端,服務端會快取該session(會話),當客戶端請求到來的時候,服務端就知道是哪個使用者的請求,並將處理的結果傳回給客戶端,完成通訊。
透過上面的分析,可以知道session有以下問題:
1、session保存在服務端,當客戶存取量增加時,服務端就需要儲存大量的session會話,對伺服器有很大的考驗;
2、當服務端為叢集時,使用者登陸其中一台伺服器,會將session保存到該伺服器的記憶體中,但是當使用者的訪問到其他伺服器時,會無法訪問,通常採用快取一致性技術來保證可以共享,或者採用第三方快取來保存session,不方便。
Json Web Token是怎麼做的?
1、客戶端透過使用者名稱和密碼登入伺服器;
2、服務端對客戶端身分進行驗證;
3、服務端對該使用者產生Token,傳回給客戶端;
4、客戶端將Token儲存到本機瀏覽器,一般會儲存到cookie中;
5、客戶端發起請求,需攜帶該Token;
6、服務端收到請求後,先驗證Token,之後傳回資料。
服務端不需要保存Token,只需要對Token中攜帶的資訊進行驗證即可;
無論客戶端存取後台的那台伺服器,只要可以通過用戶資訊的驗證即可。
Json Web Token長什麼樣子呢?
透過名字就可以看出來,就是一個json。
由三個部分內容組成:
頭(header),一般很少改動直接使用預設的即可:
{ ‘typ’:‘JWT’, ‘alg’:‘HS256’ }
(playload),東西都裝在這裡,預設的內容有:
{ ‘iss’:‘签发者’, ‘sub’:‘面向的用户’, ‘aud’:‘接收方’, ‘exp’: 过期时间, ‘iat’: 创建时间, ‘nbf’: 在什么时间之前,该Token不可用, ‘jti’:‘Token唯一标识’ }
根據需要用戶可以自己定義,Token中傳輸的內容,一般會將用戶名,角色等資訊放到Token中。
(signature),前面兩部分轉為字串後,使用base64編碼,然後進行加密得到一個字串。
Token = header(base64) playload(base64) signature;
實作流程
–>使用者登入,伺服器產生一個token(加密字串)傳送給前端,
–>前端將token保存(想存哪就存哪)
–>前端發起資料請求時攜帶token
–>服務端驗證token是否合法,合法繼續操作,不合法終止操作
token的使用場景:無狀態請求,保持使用者的登入狀態,第三方登入(token auth2.0)
#支援演算法##
alg参数值 | 数字签名或MAC算法 |
---|---|
HS256 | 使用SHA-256哈希算法的HMAC |
HS384 | 使用SHA-384哈希算法的HMAC |
HS512 | 使用SHA-512哈希算法的HMAC |
RS256 | 使用SHA-256哈希算法的RSASSA-PKCS1-v1_5 |
RS384 | 使用SHA-384哈希算法的RSASSA-PKCS1-v1_5 |
RS512 | 使用SHA-512哈希算法的RSASSA-PKCS1-v1_5 |
PS256 | 使用SHA-256哈希算法的RSASSA-PSS(仅节点^ 6.12.0 OR> = 8.0.0) |
PS384 | 使用SHA-384哈希算法的RSASSA-PSS(仅节点^ 6.12.0 OR> = 8.0.0) |
PS512 | 使用SHA-512哈希算法的RSASSA-PSS(仅节点^ 6.12.0 OR> = 8.0.0) |
ES256 | 使用P-256曲线和SHA-256哈希算法的ECDSA |
ES384 | 使用P-384曲线和SHA-384哈希算法的ECDSA |
ES512 | 使用P-521曲线和SHA-512哈希算法的ECDSA |
没有 | 不包含数字签名或MAC值 |
开发时使用
安装
npm install jsonwebtoken --save
使用
const jwt = require('jsonwebtoken');//加载包 //产生token默认算法hs256 let token=jwt.sign({user:'123'},'123114655sad46aa');//此方法接收两个参数,第一个是要加密保存的数据(一个对象,不要放隐秘性的数据,如密码),第二个是要加密的私钥(一个字符串,越乱越好) console.log(token);//返回一个加密字符串 // 服务器签发的token //eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiMTIzIiwiaWF0IjoxNTcwMDc2NjU5fQ.3FT6v8zVptdWGBILD1m1CRY6sCP1I3E947krUh_E3 //客户端请求数据的时候验证token //客户端传递过来的token let tokens=token; jwt.verify(tokens,'123114655sad46aa',function (err,data) { //verify接收两个参数,第一个参数是客户端传递过来的token,第二个参数是加密时的私钥;第三个参数是回调函数 console.log(err);//签名通过返回null,签名不通过返回err(JsonWebTokenError: invalid signature) console.log(data);// 通过返回解密数据,失败返回unfinished });
更多node相关知识,请访问:nodejs 教程!!
以上是nodejs jwt是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!