express 使用express-jwt、jsonwebtoken进行token的生成与校验

Node Express

安装

npm
1npm i express-iwt jsonwebtoken

创建token生成和解密的工具代码

1//utils.ts
2const jwt = require("jsonwebtoken")
3const jwtSecret: string = 'mb_own_token';  //token签名,自己随便定义就行
4
5export default class Utils {
6    static setToken = (username: string, user_id: string): Promise<String> => {
7        return new Promise(resolve => {
8            //expires 设置token过期的时间
9            //{ user_name: user_name, user_id: user_id } 传入需要解析的值( 一般为用户名,用户id 等)
10            //!!!重点 这个Bearer一定要加啊,,不然会报错
11            const token: string = 'Bearer ' + jwt.sign({
12                user_name: username,
13                user_id: user_id
14            }, jwtSecret, {expiresIn: '24h'});
15            resolve(token)
16        })
17    }
18    static getToken = (token: string): Promise<object> => {
19        return new Promise((resolve, reject) => {
20            if (!token) {
21                console.log('token是空的')
22                reject({
23                    error: 'token 是空的'
24                })
25            } else {
26                //第二种  改版后的
27                const info = jwt.verify(token.split(' ')[1], jwtSecret);
28                resolve(info);  //解析返回的值(sign 传入的值)
29            }
30        })
31    }
32}

在登录模块创建token并返回

1//user.ts
2import ex = require("express");
3let router = ex.Router();
4const userModel = require("./userModel");
5//引入
6import utils from "../tools/utils";
7
8interface userModelInstance {
9    username: string;
10    _id: string;
11    password?: string;
12}
13
14router.use((req, res, next) => {
15    console.log("请求的时间", Date.now());
16    next();
17});
18router.post("/login", (req, res) => {
19    let loginData = req.body
20    loginData.password = utils.genPassword(String(loginData.password))
21    userModel
22        .find(loginData)
23        .then((result: Array<userModelInstance>) => {
24            if (result.length > 0) {
25                let userOBJ: userModelInstance = Object.create(result[0]);
26                //登录成功生成签名,返回给前端
27                utils.setToken(userOBJ.username, userOBJ._id).then(token => {
28                    res.send({
29                        code: 200,
30                        user: {username: userOBJ.username, _id: userOBJ._id},
31                        message: '登录成功',
32                        token: token
33                    })
34                })
35            }else {
36                res.send({
37                    code: 200,
38                    message: '登录失败,瓜怂',
39                })
40            }
41        })
42        .catch((err: object) => {
43            console.error(err);
44        });
45});
46module.exports = router;

app.ts入口文件加token判断

1// app.ts
2"use strict";
3import express = require("express");
4const app: express.Application = express();
5const bodyParser = require("body-parser");
6const expressJwt=require('express-jwt')
7import utils from "./tools/utils";
8app.use(bodyParser.json()); //解析json类型的请求体
9/*引入数据库操作的模块start*/
10const user = require('./user/user')
11/*数据库操作的模块end*/
12app.use(expressJwt({
13    secret:'mb_own_token',
14    algorithms:['HS256']
15}).unless({
16    path:['/user/login','/user/register']  //这里设置不需要验证的接口名称
17}))
18//开始校验token
19app.use((req,res,next)=>{
20    const token =  req.headers['authorization'];
21    if(token == undefined){
22         next();
23    }else{
24        utils.getToken(token).then((data)=> {
25             next();
26        }).catch(()=>{
27            console.log(123)
28             next();
29        })
30    }
31})
32
33//挂载用户操作相关模块
34app.use('/user',user)
35//token失效返回信息
36app.use(function(err:any,req:any,res:any,next:any){
37    if(err.status==401){
38        return res.json({token:false,message:'token失效'})
39        //可以设置返回json 形式  res.json({message:'token失效'})
40    }
41})
42app.listen(process.env.PORT || 8000, function () {
43   console.log("Listen port:8000...");
44});
45```../../../src/components/Tag