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

目录
  • 1. 生成Token jwt passport实现生成和验证Token
  • 2. 使用passpport-jwt||passport验证Token
  • 总结

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验证内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • node.js+captchapng+jsonwebtoken实现登录验证示例

    提到登录验证,大家肯定能想到的就是12306的验证码了吧.12306为了防止刷票,可以说是煞费苦心,验证码也越来越难识别,最终即使是人也可能识别不了了. 今天,小编就给大家说一下node如何实现图片验证码,以及使用token验证登录.学习本文你将学到: 1.使用captchapng生成图片验证码 2.使用jsonwebtoken实现登录验证 一.图片验证码生成(最后有全部代码) 首先,我们理一下流程,第一步服务器要随机生成一组四位数. 第二步,将这四位数用canvas绘图生成图片. 第三步,我们

  • node实现基于token的身份验证

    最近研究了下基于token的身份验证,并将这种机制整合在个人项目中.现在很多网站的认证方式都从传统的seesion+cookie转向token校验.对比传统的校验方式,token确实有更好的扩展性与安全性. 传统的session+cookie身份验证 由于HTTP是无状态的,它并不记录用户的身份.用户将账号与密码发送给服务器后,后台通过校验,但是并没有记录状态,于是下一次用户的请求仍然需要校验身份.为了解决这一问题,需要在服务端生成一条包含用户身份的记录,也就是session,再将这条记录发送给

  • node脚手架搭建服务器实现token验证的方法

    内容 用脚手架快速搭建 node 项目 用 mysql 连接池实现与数据库的交互 用 jsonwebtoken 实现 token 身份验证 综合案例:用简介登录页面实现上述内容 1. 快速搭建 node 项目 我们都知道 express 框架可高效的开发 node 服务器,但对于底层的搭建还要靠自己手写.然而 express-generator 的出现就很好地解决了此问题,它可一键为我们生成项目基本骨架,可谓node 脚手架 1.1 生成项目 ①:首先全局安装 express : npm ins

  • 在node中使用jwt签发与验证token的方法

    1.什么是token token的意思是"令牌",是服务端生成的一串字符串,作为客户端进行请求的一个标识. token是在服务端产生的.如果前端使用用户名和密码向服务端发送请求认证,服务端认证成功,那么在服务端会返回token给前端. 前端可以在每次请求的时候带上token证明自己的合法地位.如果token在服务端持久化,那他就是一个永久的身份令牌. 2.什么是jwt jwt,即JSON Web Token的缩写,是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在

  • node.js实现token身份验证的示例代码

    安装依赖 express-jwt npm i express-jwt 将token校验相关数据导入配置文件 // setting.js module.exports = {     token: {         // token密钥         signKey: 'blog_globM_token_key_$$$$',         // 过期时间         signTime: 3600 * 24 * 3,         // 请求头参数         header: 'au

  • Node登录权限验证token验证实现的方法示例

    1. token的使用场景 无状态请求 保持用户的登录状态 第三方登录(token+auth2.0) 2. 基于token的验证原理 后端不再存储认证信息,而是在用户登录的时候生成一个token,然后返回给前端,前端进行存储,在需要进行验证的时候将token一并发送到后端,后端进行验证 加密的方式:对称加密和非对称加密,对称加密指的是加密解密使用同一个密钥,非对称加密使用公钥和私钥,加密用私钥加密,解密用公钥解密 3. 基于Token的身份验证的过程如下: 客户端:用户名和密码请求登录 服务器:

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

    目录 1. 生成Token jwt passport实现生成和验证Token 2. 使用passpport-jwt||passport验证Token 总结 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

  • 详解Node.js使用token进行认证的简单示例

    本文只介绍简单的应用,关于json web token的具体介绍以及原理请参考阮一峰老师的JSON Web Token 入门教程. 使用的Node框架是koa2,前端发送ajax请求使用axios 首先创建工程目录: static中存放静态资源,views存放前端模板,server.js为后端代码. 安装必要的依赖项: "dependencies": { "@koa/router": "^8.0.8", "jsonwebtoken&qu

  • Node.js发起HTTP请求的6种不同方法小结

    目录 介绍 正文 Node.jsHTTPSModule Axios Got Needle Superagent Node-fetch 对比 结语 介绍 本期将向大家介绍6种不同的方法在node.js中去发起HTTP请求,这里我们会通过对掘金社区的板块分类接口 的请求作为演示来完成这个每种不同方法的使用,当然为了更清晰的打印出所得到的数据,我们要提前安装chalk库来给其打印的数据加上颜色,好了,我们马上就要开始啦~ 正文 Node.js HTTPS Module Node.js在标准库中带有ht

  • js执行shell命令的几种方式(Node)

    目录 前言 调起shell的几种方式介绍(不限于这几种) 1.child_process 2.shelljs 3.simple-git 总结 在做一个客户端基建项目的时候,多处需要用到JS调取命令行执行shell脚本,这里对shell命令.JS执行shell命令做一个简单的介绍和总结. 前言 一般在纯前端静态页面的项目中,是不需要JS调命令行操作的,通常在Node项目,或者在Electron客户端项目中,可能会有这样的需求.(electron这个客户端框架本身就内置了node的很多方法).因此下

  • Node.js实现下载文件的两种实用方式

    目录 第一种方式:使用原生的http模块 第二种方式:使用Express+Axios下载文件 总结 设置响应头 返回数据流 第一种方式:使用原生的http模块 我们仅需要用到fs和http两个node.js的原生模块,不需要安装第三方模块,就可以实现文件的下载.代码如下: var fs = require('fs'); var http = require("http"); var server = http.createServer(); server.on("reques

  • 在表单提交前进行验证的几种方式整理

    在表单提交前进行验证的几种方式 . 在Django中,为了减轻后台压力,可以利用JavaScript在表单提交前对表单数据进行验证.下面提供了有效的几种方式(每个.html文件为一种方式). formpage1.html 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional

  • Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)

    AngularJS提供了表单验证,但是验证的过程交互体验很不好,比如重设密码,重复密码的时候一键入就会提示密码不正确,现整理了两种方法,仅供借鉴. 一,点击提交验证 <form action="" class="form-horizontal col-md-9" name="reset_pwd" ng-submit="resetPwd()"> <div class="form-group"

  • 原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1. 通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  "的方式直接更改CSS样式. 2. 先在CSS样式表中对特定的类如"active类"设置样式(这里的active类是假定的,暂时不存在),然后再在javascript代码中通过node.classname="active"使得CSS样式表中对active类的样式设

  • JS中检测数据类型的几种方式及优缺点小结

    1.typeof 用来检测数据类型的运算符 typeof value 返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."string"."boolean"."undefined"."object"."function" 局限性: 1)typeof null ->"object" 2)检测的不管是数组还是正则都返回的是"ob

随机推荐