刷新Token
前置内容
- 【Nodejs express 连接Mysql】: https://www.hyz.cool/articles/207
- 【Nodejs express 连接 Redis】: https://www.hyz.cool/articles/208
- 【登录实现——云剪切板—用户模块】: https://www.hyz.cool/articles/210
路由
const express = require("express")
const TokenController = express.Router();
const TokenService = require("../services/TokenService")
TokenController.get("/refresh",TokenService.refresh)
module.exports = TokenController
js
数据库访问
import {VALUE} from "../utils/Constances";
import {Query} from "../services/MysqlService";
export const getToken = (tokenKey) => {
return Query("SELECT `token` FROM `tb_token` WHERE `token_key` = ? ", [tokenKey])
}
js
服务
import jwt from "jsonwebtoken";
import {JWTSecret, KEY} from "../utils/Constances";
import Result from "../utils/Result";
import {RedisService} from "./RedisService";
import UserDTO from "../dtos/UserDTO";
const TokenDao = require("../daos/TokenDao")
export const refresh = (req, res, next) => {
let tokenKey = getTokenKey(req.headers.cookie)
if (!tokenKey) return Result.result(res, Result.notLogin());
TokenDao.getToken(tokenKey).then(result => {
if (result.length < 1) return Result.result(res, Result.notLogin());
else {
let token = result[0].token
parseUserDTOFromToken(token).then(userDTO => {
creteToken(userDTO,tokenKey);
return Result.result(res,Result.success(userDTO))
}).catch(err => {
console.log(err)
return Result.result(res, Result.notLogin());
})
}
}).catch(err => {
return Result.result(res, Result.failed("刷新token失败"));
})
}
function parseUserDTOFromToken(token) {
return new Promise((resolve, reject) => {
jwt.verify(token, JWTSecret, (err, result) => {
console.log("result...", err, result)
if (err) reject(err)
else resolve(new UserDTO(result))
})
})
}
function getTokenKey(cookie = "") {
let arr = cookie.split(";")
for (let i = 0; i < arr.length; i++) {
if (arr[i].trim().startsWith(KEY.COOKIE + "=")) {
return decodeURIComponent(arr[i].trim().substring(5))
}
}
return ""
}
export const creteToken = (userDTO,tokenKey) => {
let token = jwt.sign({...(new UserDTO(userDTO))}, JWTSecret, {expiresIn: "2h"});
RedisService().set(KEY.TOKEN + tokenKey, token, {EX: 2 * 60 * 60})
}
js