1.什么是token
token是一個令牌,是前后端開發時的一個驗證工具,(就是一個字串)
我們先解釋一下他的含義:
1、Token的引入:Token是在客戶端頻繁向服務端請求資料,服務端頻繁的去資料庫查詢用戶名和密碼并進行對比,判斷用戶名和密碼正確與否,并作出相應提示,在這樣的背景下,Token便應運而生,
2、Token的定義:Token是服務端生成的一串字串,以作客戶端進行請求的一個令牌,當第一次登錄后,服務器生成一個Token便將此Token回傳給客戶端,以后客戶端只需帶上這個Token前來請求資料即可,無需再次帶上用戶名和密碼,
3、使用Token的目的:Token的目的是為了減輕服務器的壓力,減少頻繁的查詢資料庫,使服務器更加健壯,
了解了Token的意義后,我們就更明確的知道為什么要用他了
2.token的使用流程
1.前端向后端傳遞用戶名和密碼
2.后端將接收到的的用戶名和密碼進行核實
3.后端核實成功后會,回傳給前端一個token(或者直接將token保存在cookie中);
4.前端得到token 并對其進行保存
5.如果前端請求隱私的介面(比如需要登陸后才能查看商品的詳細資訊),則需要傳遞保存的token(進行ajax請求時,將資訊放在請求頭中)
6.后端對其進行驗證,如果token錯誤,則請求不到資料,回傳給前端相應的提示
如果token驗證正確,則 獲取相應的資料,并回傳給前端

3.JWT的構成
JWT是由三部分構成,將這三段資訊文本用鏈接構成了JWT字串, header + payload +secret = 加密的字串
1.header 頭部
2.payload 負載-------寫相關的資訊
{
user:"簽發者",
exp:"token過期時間"//必須大于簽發時間
}
3.secret 密鑰------用來進行jwt的簽發和jwt的驗證,它就是你服務端的私鑰,在任何場景都不應該流露出去實際的 JWT 大概就像下面這樣

它是一個很長的字串,中間用點(.)分隔成三個部分,注意,JWT 內部是沒有換行的,這里只是為了便于展示,將它寫成了幾行,
JWT 的三個部分依次如下,
- Header(頭部)
- Payload(負載)
- Signature(簽名)
寫成一行,就是下面的樣子,
Header.Payload.Signature

1 Header
Header 部分是一個 JSON 物件,描述 JWT 的元資料,通常是下面的樣子,
{ "alg": "HS256", "typ": "JWT" }
上面代碼中,alg屬性表示簽名的演算法(algorithm),默認是 HMAC SHA256(寫成 HS256);typ屬性表示這個令牌(token)的型別(type),JWT 令牌統一寫為JWT,
最后,將上面的 JSON 物件使用 Base64URL 演算法(詳見后文)轉成字串,
2 Payload
Payload 部分也是一個 JSON 物件,用來存放實際需要傳遞的資料,JWT 規定了7個官方欄位,供選用,
- iss (issuer):簽發人
- exp (expiration time):過期時間
- sub (subject):主題
- aud (audience):受眾
- nbf (Not Before):生效時間
- iat (Issued At):簽發時間
- jti (JWT ID):編號
除了官方欄位,你還可以在這個部分定義私有欄位,下面就是一個例子,
{ "sub": "1234567890", "name": "John Doe", "admin": true }
注意,JWT 默認是不加密的,任何人都可以讀到,所以不要把秘密資訊放在這個部分,
這個 JSON 物件也要使用 Base64URL 演算法轉成字串,
4.后端JWT的構建
// 1.下載包
npm install jsonwebtoken --save-dev
// 2.引入
var JWT = require("jsonwebtoken");
//負載資訊
let payload = {
user:"sun",
// exp:"1000 * 60"//單位 ms
}
//密鑰
let secret = "123456";
//生成token,exporesIn為過期時間,單位:ms/h/days/d eg:1000, "2 days", "10h", "7d"
let token= JWT.sign(payload,secret,{expiresIn:"1h"})
//將token保存在cookie中
res.cookie("token",token);
5.前端請求保密性的資訊(比如:必須登錄后,才能查看商品的詳細資訊),發送JWT
//獲取cookie,
var token = $.cookie("token");
//發起ajax請求,將token發送到后端
$.ajax({
type: "get",
url: "/goods",
//將資訊保存在請求頭中
headers: {
auth: token
}
})
6.后端驗證JWT
//獲取前端傳來的tokenlet token = req.headers.auth;
JWT.verify(token, "密鑰", (err, decoded) => {
if (err) {
//驗證失敗
//console.log("令牌失效");
res.json({
status:false,
info:"令牌失效"
})
} else {
//驗證成功
//獲取前端需要的相應資料
//回傳給前端相應的資訊
res.json({
status:true,
info:請求的資料
})
}
})
總結
token簡單的使用流程,(nodejs)
Token的作用主要有兩個,一是防止表單重復提交,二是驗證身份,
Token使用的流程:
1 首先安裝第三方依賴cnpm install jsonwebtoken --save-dev
2 在controller層引入第三方依賴:const JWT = require(“jsonwebtoken”)
3 定義頭部:let header = {一般第一JWT的資訊和簽名使用的方法}
4 定義負載:let payload = {有固定的格式}
5 定義秘鑰:let secret = “”;
6 將三部分用base64編碼后將三部分拼接起來,
Let token = JWT.sign(payload,secret,{expiresIn : “10h”});
7 將token存入cookie中:res.cookie(“token”,token)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240498.html
標籤:其他
