token驗證是一種web安全的手段,咱們要求來自客戶端的請求必須攜帶token(登陸請求除外),服務端每次處理請求都會驗證token,驗證經過則繼續後續邏輯,不然返回相應狀態碼打回web
npm install jsonwebtoken --save
複製代碼
經過jsonwebtoken能夠建立token或解碼已有token獲取信息npm
const jwt = require('jsonwebtoken')
// 建立token
let token = jwt.sign(obj,secret,opt)
//解碼token
let payload = jwt.verify(token,secret)
複製代碼
secret 是你本身規定的簽名,建立token和解碼token都須要這個字符串json
當咱們收到前臺傳來的賬號密碼查庫比對經過後,建立token並返回客戶端安全
const police = require("../../../model/police");
const jwt = require('jsonwebtoken')
let myPolice = new police();
let {secret} = require('../../../util/secret.js')
async function login(ctx, next) {
let postData = ctx.request.body
let selectResult = await myPolice.checkLogin(postData)
if (selectResult.err) {
ctx.body = {
status: 1,
message: err
}
} else if (!selectResult.result) {
ctx.body = {
status: 1,
message: '用戶不存在'
}
} else if (selectResult.result[0].password !== postData.password) {
ctx.body = {
status: 1,
message: '密碼錯誤'
}
} else {
// 賬號密碼正確 建立token
//payload中寫入一些值 time:建立日期 timeout:多長時間後過時
let payload = {userNumber:postData.userNumber,time:new Date().getTime(),timeout:1000*60*60*2}
let token = jwt.sign(payload, secret);
ctx.body = {
status: 0,
message: '登陸成功',
data:{
token
}
}
}
}
module.exports = login
複製代碼
根據koa洋蔥式的中間件機制,咱們能夠寫個檢查token的中間件,咱們乾的事情就是拿到客戶端傳來的token,解碼後取出重要信息,檢查bash
const Promise = require("bluebird");
const jwt = require("jsonwebtoken");
const verify = Promise.promisify(jwt.verify);
let { secret } = require("../util/secret");
async function check(ctx, next) {
let url = ctx.request.url;
// 登陸 不用檢查
if (url == "/users/login") await next();
else {
// 規定token寫在header 的 'autohrization'
let token = ctx.request.headers["authorization"];
// 解碼
let payload = await verify(token,secret);
let { time, timeout } = payload;
let data = new Date().getTime();
if (data - time <= timeout) {
// 未過時
await next();
} else {
//過時
ctx.body = {
status: 50014,
message:'token 已過時'
};
}
}
}
module.exports = check
複製代碼
const check = require('./utils/check')
app.use(check)
複製代碼