node.js配置Token验证的2种方式总结

 更新时间:2023年02月03日 10:20:35   作者:抗争的小青年  
token验证,在设计登录注册和一些权限接口时发挥作用,下面这篇文章主要给大家介绍了关于node.js配置Token验证的2种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

1. 生成Token jwt passport实现生成和验证Token

jsonwebtoken

1.安装

npm i jsonwebtoken

2.引入

const jwt = require('jsonwebtoken')s

3.定义规则

const rule = {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> id: result[0].id, name: result[0].name }

由于id,和name都是通过数据库获取过来的,所以用的这种方式

4.设置jwt.sign方法/生成token

jwt.sign("规则", "加密名字", "过期时间", "箭头函数")
        jwt.sign(rule, key.secretOrkey, { expiresIn: 3600 }, (err, token) => {
          if (err) return err.message
          return res.send({
            code: 1,
            msg: `Bearer ${token}`
          })
        })

这里的rule就是上面所说的校验规则,key.secretOrkey就是加密名字,只不过封装到了外部,expiresIn:3600,就说明是3600秒,msg返回的就是生成的Token

5.验证token

// $router get api/user/current
// @desc return current user
// @access private
router.get("/current", "验证Token", (req, res) => {
  res.send({
    code: 1,
    msg: '验证成功'
  })
})

我们需要在"验证Token"那里对Token进行验证

2. 使用passpport-jwt||passport验证Token

passport

passport-jwt

1.安装

npm install passport-jwt
npm i passport

2.使用

这是从npm摘抄过来的的示例方法

passport

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));

这个方法中的User.findOne方法可以删除,写上自己的业务逻辑,我用的是mysql,所以没有用User.findeOne方法

初始化passport

app.use(passport.initialize());

passport-jwt

new JwtStrategy(options, verify)

3.实际使用

index.js(项目入口文件)

const passport = require("passport")

//在入口文件中配置和引用
//初始化passport
app.use(passport.initialize());
require("./config/passport")(passport)

这里单独抽离了passport配置文件,同时将上面引入的passprot进行引入

config/passport.js

const db = require("../db/index")
const JwtStrategy = require('passport-jwt').Strategy
const ExtractJwt = require('passport-jwt').ExtractJwt

const key = require("../config/key")
const opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = key.secretOrkey;


module.exports = passport => {
  passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
    // { id: 1, name: 'wz', iat: 1660299838, exp: 1660303438 }
    console.log(jwt_payload);
    sqlcc = `SELECT * FROM user WHERE id=${jwt_payload.id};`
    db.query(sqlcc, (err, result) => {
      console.log(result[0]);
      if (err) {
        return done(null, err.message)
      }
      if (result.length != 0) {
        return done(null, result[0])
      } else {
        return done(null, false)
      }
    })
  }));
}

注意,生成的token应该带有统一的格式。一个正确的token应该是这样的Bearer ${token},注意Bearer和生成的Token之间的空格。

接下来在需要校验的地方验证Token

// $router get api/user/current
// @desc return current user
// @access private
router.get("/current", passport.authenticate("jwt", { session: false }), (req, res) => {
  res.send({
    code: 1,
    msg: req.user
  })
})

验证token如果通过,就会执行passport.use里的方法,同时jwt_jpayload会输出结果,得到结果后,我们在用id在User表中查询数据,然后通过req.user(数据库表名)拿到。

// { id: 1, name: 'wz', iat: 1660299838, exp: 1660303438 }
console.log(jwt_payload);

2. express-jwt || jsonwebtoken生成Token验证Token 安装

npm install jsonwebtoken express-jwt
注意

jsonwebtoken用于生成JWT字符串

express-jwt用于将Jwt字符串解析为JSON对象

新建文件夹config/key.js

module.exports = {
  keyOringe: "secret"
}

将设置的key值暴露出去

在需要的地方引入

const jwt = require("jsonwebtoken")
    if (password == tools.setPassword(results[0].password)) {
      //如果成功,传1,页面跳转交给vue
+      const rule = {
+        id: results[0].id,
+        adminname: results[0].adminname
+      }

+      const tokenstr = jwt.sign(rule, key.keyOringe, { expiresIn: 3600 })
+      res.send({

        code: 1,
        msg: '登陆成功',
+        token: tokenstr
      })
    }
  • 调用 jwt.sign() 方法生成JWT字符串 并通过 token 属性发送给客户端
  • 参数1: 用户的信息对象
  • 参数2: 加密的密钥
  • 参数3: 配置对象 可以配置当前 token 的有效期
  • rule只是抽离出去,其实直接写也没问题

在中间件中使用

const { expressjwt: jwt } = require("express-jwt")
const key = require('../config/key')

router.use(jwt({
  secret: key.keyOringe,
  algorithms: ["HS256"],
}).unless({ path: ["/admin/login", "/admin/register"] })
)

之后使用私有接口去访问

//$route GET admin/banner/
//@desc 修改轮播图接口
router.get('/', (req, res) => {
  console.log(req);
  res.send({
    code: 1,
    msg: '获取用户信息成功',
    data: req.auth
  })
})

这样就会返回带有用户信息的Token了!

捕获解析JWT失败后产生的错误

当使用express-jwt解析Token字符串时,如果客户端发送的Token字符串过期不合法,会产生一个解析失败的错误,影响项目的正常运行,可以通过Express的错误中间件,捕获这个错误并且进行相关的处理,示例代码如下:

//在所有路由后面定义错误中间件
//使用全局错误处理中间件 捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {
  //判断是否由 Token 解析失败导致的
  if (err.name == 'UnauthorizedError') {
    return res.send({
      status: 401,
      message: '无效的Token'
    })
  }
  res.send({
    status: 500,
    message: '未知的错误'
  })
})

总结

到此这篇关于node.js配置Token验证的2种方式总结的文章就介绍到这了,更多相关node.js配置Token验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • NodeJS实现单点登录原理解析

    NodeJS实现单点登录原理解析

    随着公司业务的增多,必然会产生各个不同的系统,如果每个系统都需要单独登录的话就会很不方便,所以这个时候单点登录会很方便,今天通过本文给大家讲解NodeJS实现单点登录原理解析,感兴趣的朋友一起看看吧
    2022-05-05
  • npm配置淘宝镜像的教程详解

    npm配置淘宝镜像的教程详解

    npm淘宝镜像,也称为npm cnpm或npm.taobao.org,是一个针对npm包管理器的国内镜像服务,通过设置npm淘宝镜像,你可以更快地下载和安装依赖,本文给大家介绍了npm配置淘宝镜像的教程,需要的朋友可以参考下
    2024-07-07
  • 基于 Node.js 实现前后端分离

    基于 Node.js 实现前后端分离

    为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异。痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的NodeJS,试图探索一条全新的前后端分离模式。
    2016-04-04
  • npm install安装报错:gyp info it worked if it ends with ok的解决方法

    npm install安装报错:gyp info it worked if it ends with 

    今天新启动一个项目,在 npm install 安装依赖项时出现报错,所以下面这篇文章主要给大家介绍了关于npm install安装报错:gyp info it worked if it ends with ok的解决方法,需要的朋友可以参考下
    2022-07-07
  • node.js中path路径模块的使用方法实例分析

    node.js中path路径模块的使用方法实例分析

    这篇文章主要介绍了node.js中path路径模块的使用方法,结合实例形式分析了node.js path路径模块的基本功能、原理、使用方法及操作注意事项,需要的朋友可以参考下
    2020-02-02
  • express框架通过ejs模板渲染输出页面实例分析

    express框架通过ejs模板渲染输出页面实例分析

    这篇文章主要介绍了express框架通过ejs模板渲染输出页面的方法,结合实例形式分析了express框架使用ejs模版引擎渲染输出的相关操作技巧与使用注意事项,需要的朋友可以参考下
    2023-05-05
  • node.js接口复习及使用案例解析

    node.js接口复习及使用案例解析

    这篇文章主要为大家介绍了node.js接口的复习及使用案例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Node使用koa2实现一个简单JWT鉴权的方法

    Node使用koa2实现一个简单JWT鉴权的方法

    这篇文章主要介绍了Node使用koa2实现一个简单JWT鉴权的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • nodejs使用node-xlsx生成excel的方法示例

    nodejs使用node-xlsx生成excel的方法示例

    这篇文章主要介绍了nodejs使用node-xlsx生成excel,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • HTTP JSON接口模拟工具Interfake快速入门教程

    HTTP JSON接口模拟工具Interfake快速入门教程

    这篇文章主要为大家介绍了HTTP JSON接口模拟工具Interfake快速入门教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论