• koa如何进行token设置和进行token过期验证


    一,安装包文件

    npm i jsonwebtoken

    二,通过jsonwebtoken设置token 

     const jwt = require('jsonwebtoken')
        // 创建token
    let token = jwt.sign(obj,secret,opt)
        //解码token
    let payload = jwt.verify(token,secret)

    三,实现思路

    login

    当我们收到前台传来的帐号密码查库比对通过后,创建token并返回客户端

    1. // 登录接口login
    2. router.post('/login', async ctx => {
    3. const { email, password } = ctx.request.body
    4. const findRelut = await User.find({ email })
    5. if (findRelut.length > 0) {
    6. // 验证密码
    7. const result = bcrypt.compareSync(password, findRelut[0].password);
    8. console.log(result);
    9. if (result) {
    10. // 返回token
    11. let payload = { password, time: new Date().getTime(), timeout: 1000 * 60 * 60 * 2 }
    12. let token = jwt.sign(payload, "screct");
    13. ctx.status = 200
    14. ctx.body = {
    15. message: '登录成功',
    16. token: token
    17. }
    18. } else {
    19. ctx.status = 400
    20. ctx.body = {
    21. message: '密码错误重新登录'
    22. }
    23. }
    24. } else {
    25. ctx.status = 404
    26. ctx.body = {
    27. message: '用户不存在,请先注册'
    28. }
    29. }
    30. })

    四,如何进行token校验

    1.创建checkToken.js文件

    1. const jwt = require('jsonwebtoken')
    2. async function check(ctx, next) {
    3. // split('?')[0]把字符串分割成字符串数组——拿到url值
    4. let url = ctx.url.split('?')[0]
    5. // 如果是登陆页面和注册页面就不需要验证token了
    6. if (url === '/api/users/login' || url === "/api/users/login") {
    7. await next()
    8. } else {
    9. //获取到token
    10. let token = ctx.request.headers["authorization"].spilt('Bearer ')[1]
    11. if (token) {
    12. // 如果有token的话解析
    13. const tokenItem = jwt.verify(token, 'screct')
    14. // 把创建时间和过期时间析构出来
    15. const { time, timeout } = tokenItem
    16. // 拿到当前时间
    17. let NewTime = new Date.getTime()
    18. if (NewTime - time <= timeout) {
    19. // 说明没过期
    20. await next()
    21. } else {
    22. ctx.body = {
    23. status: 405,
    24. message: '请带上token'
    25. }
    26. }
    27. } else {
    28. ctx.body = {
    29. status: 405,
    30. message: 'token 已过期,请重新登陆'
    31. }
    32. }
    33. }
    34. }
    35. module.exports = check

     2.参数说明:

    1. iss: 签发者
    2. sub: 面向用户
    3. aud: 接收者
    4. iat(issued at): 签发时间
    5. exp(expires): 过期时间
    6. nbf(not before):不能被接收处理时间,在此之前不能被接收处理
    7. jti:JWT ID为web token提供唯一标识
    8. 例如
    9. {"sub":"subject","aud":"sina.com","iss":"baidu.com","iat":1528360628,"nbf":1528360631,"jti":"253e6s5e","exp":1528360637}

    3.jwt.sign(object,key)说明

    两个参数分别是签名算法和自定义的签名Key(盐)。签名key可以byte[] 、String及Key的形式传入。前两种形式均存入builder的keyBytes属性,后一种形式存入builder的key属性。如果是第二种(及String类型)的key,则将其进行base64解码获得byte[] 。

    五、在app.js入口中注用

    1. const checkToken = require('./middleware/checkToken.js')
    2. // 验证token的中间件函数
    3. app.use(checkToken)

  • 相关阅读:
    MySQL---表的增删改查(基础)
    C基础-操作符详解
    原生php 实现redis登录五次被禁,隔天再登陆
    【g2o】g2o学习笔记 BA相关
    -最低分-
    监控指定任务,结束钉钉通知
    电脑重装系统后Word文档如何横向排版
    lvgl 页面管理器
    全场景数实融合聚焦北京——2023(第六届)行业信息技术应用创新大会隆重召开
    【CSS】不定区间进度条
  • 原文地址:https://blog.csdn.net/qq_56989560/article/details/126649082