刷新Token

前置内容

  1. 【Nodejs express 连接Mysql】: https://www.hyz.cool/articles/207
  2. 【Nodejs express 连接 Redis】: https://www.hyz.cool/articles/208
  3. 【登录实现——云剪切板—用户模块】: https://www.hyz.cool/articles/210

路由

  • TokenController.js
const express = require("express")
const TokenController = express.Router();
const  TokenService = require("../services/TokenService")

TokenController.get("/refresh",TokenService.refresh)

module.exports = TokenController
js

数据库访问

  • TokenDao.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

服务

  • TokenService.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) => {
    //拿到tokenKey
    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 => {
                //生成新的token
                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失败"));
    })
}

/**
 * 解析token
 * @param token
 * @returns {Promise<unknown>}
 */
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))
        })
    })
}

/**
 * 拿到tokenKey
 * @param cookie
 * @returns {string}
 */
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"});
    //保存token到redis
    RedisService().set(KEY.TOKEN + tokenKey, token, {EX: 2 * 60 * 60})
}
js
打赏
  • 微信
  • 支付宝
评论
来发评论吧~
···

歌手: