一、jsonwebtoken 用于生成token(加密)

> jsonwebtoken

1. 安装

npm i jsonwebtoken --save

2. 使用

2.1 引入

2.2 加密

用户登录成功后,后端生成token,返回给前端

二、passport、passport-jwt 用于验证token(解密)

passport-jwt和passport中间件来验证token
passport-jwt是一个针对jsonwebtoken的插件,passport是express框架的一个针对密码的中间件
passport-jwt

  1. 安装: npm i passport-jwt passport --save

  2. 在server.js 入口文件中,引入passport

  3. 初始化passport,并引入passport.js文件

  4. 在passport.js文件中,具体配置passport

const JwtStrategy = require('passport-jwt').Strategy,ExtractJwt = require('passport-jwt').ExtractJwt;
// const mongoose = require("mongoose");
const {User} = require('../models/User.js')
// 引入keys, 拿到secret
const keys = require('../config/db.js')
const opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrKey;module.exports = (passport) => {passport.use(new JwtStrategy(opts, function(jwt_payload, done) {console.log(jwt_payload)}));
}

1)请求/current时,请求体带上token的情况:



2)请求/current时,请求头没有带上token的情况:



在users表中,添加一个字段用于权限认证,

然后接口代码users.js做如下修改:


  1. 注册时,填写identify身份字段,注册成功后返回用户的基本信息:
  2. 用户输入正确的email和password成功登录之后,给前端返回token
  3. 前端请求需要登录之后才能访问的接口时,需要在请求头中加上token,携带上token信息,否则无法拿到接口返回的数据。
// 登录 注册模块
const express = require("express")
const router = express.Router()
const bcrypt = require("bcrypt")
const gravatar = require('gravatar')
const jwt = require('jsonwebtoken')
const keys = require('../../config/db.js')const passport = require('passport')const User = require('../../models/User')router.get("/test", (req, res) => {res.json({ msg: "login works" })
})// 注册接口
router.post("/register", (req, res) => {console.log(req.body)// 查询数据库中是否存在该email的用户User.findOne({email: req.body.email}).then((user) => {if (user) {return res.status(400).json({ msg: "邮箱已被注册" })} else {var avatar = gravatar.url(req.body.email, {s: '200', r: 'pg', d: 'mm'});const newUser = new User({name: req.body.name,email: req.body.email,avatar: avatar,password: req.body.password,identify: req.body.identify})// 对密码进行加密bcrypt.genSalt(10, function (err, salt) {bcrypt.hash(newUser.password, salt, function (err, hash) {if (err) throw err;newUser.password = hashnewUser.save().then((user) => {res.json(user)}).catch((err) => {console.log(err)})});});}})
})// 登录接口, 返回token  jwt passport
router.post("/login", (req, res) => {const email = req.body.emailconst password = req.body.password// 根据email查询,数据库中是否存在该用户User.findOne({email: email}).then((user) => {if (!user) {return res.status(404).json({msg: '用户不存在!'})}// 用户存在,则检查密码是否一致bcrypt.compare(password, user.password).then((isMatch) => {if (isMatch) {const rule = {id: user.id, name: user.name,avatar: user.avatar,identify: user.identify}jwt.sign(rule, keys.secretOrKey, {expiresIn: 3600}, (err, token) => {if (err) throw err;return res.json({success: true,token: "Bearer " + token})})} else {return res.status(400).json({msg: '密码错误!'})}})})})// 登录后才能访问的接口
router.get("/current", passport.authenticate('jwt', {session: false}), (req, res) => {const {_id ,name, email, avatar, identify, date} = req.userres.json({id: _id,name: name,email: email,avatar: avatar,identify: identify,date: date})
})module.exports = router

Node中使用token(基于第三方包jsonwebtoken)相关推荐

  1. golang中go mod使用第三方包

    go mod init #在代码中引入第三方包之后执行下面的命令 go mod download go run xxx.go

  2. Python中矩阵运算(基于numpy包)

    1 乘法 在数组中,a * a计算对应元素相乘(矩阵点乘):在矩阵中,A*A计算矩阵乘法 np.multiply()计算对应元素相乘(矩阵点乘) np.dot()计算矩阵乘法 import numpy ...

  3. python 第三方包自动导入_7行代码,彻底告别python第三方包import导入问题!

    最近有不少小伙伴咨询关于pyton第三方包导入的问题,今天我们就来聊聊第三方包导入那些事. 随着对python学习的渐入臻境,越来越多的小伙伴们开始导入自己所需的第三方包,实现各种各样的功能.但是,他 ...

  4. node --- 在node中使用mongoosemongoDB的安装

    *首先确保,你的电脑安装了mongodb,网址: mongodb官网 *使用npm安装 mongoose: mongoose官网 ps:mongoose是Node中操作mongoDB的第三方插件.用于 ...

  5. node中模板引擎、模块导出、package.json简介

    在node.js中使用引擎模板: art-template不仅在浏览器可以使用,也可以在node中使用,并且模板引擎起早诞生于服务器领域,在node中使用模板引擎: 1.安装:在一个文件目录下执行命令 ...

  6. python怎么安装第三方库-vs2017怎么安装python第三方包

    vs2017有独立的python环境:所以想在vs2017开发python并使用第三方包,需要在vs2017中操作,完成第三方包的安装. 一,查看vs2017有哪些版本的python,当前使用的是哪个 ...

  7. vs2017怎么安装python包,vs2017安装pygame,vs2017安装python第三方包

    vs2017有独立的python环境:所以想在vs2017开发python并使用第三方包,需要在vs2017中操作,完成第三方包的安装. 一,查看vs2017有哪些版本的python,当前使用的是哪个 ...

  8. PHP常用第三方包,php第三方包管理

    前言 在编写程序的时候,我们会用到别人的第三方包,俗称轮子.如何正确引入一个第三方的包,且正确合理的放置,是一个值得规范的事情. 传统的包引入include "the/path/of/fil ...

  9. Node.js中创建package.json文件,安装第三方包

    在当前项目根目录下打开命令窗口 输入,开启安装向导 npm init 依次输入之后即可生成package.json文件,也可以不完全填写全部信息,不想填的回车可跳过. package name: (包 ...

最新文章

  1. android帧动画实现方法之一
  2. Re-installation failed due to different application signatures
  3. 在windows 2008/2012中配置RADIUS 客户端计算机上网WiFi 认证
  4. 与kylin_Kylin 迁移到 HBase 实践在小米的实践
  5. android反编译之获得res下的xml配置文件及图片等资源
  6. linux usr目录权限不够,【ARM-Linux开发】Ubuntu下的/usr目录权限,导致不能使用sudo命令的修复...
  7. leetcode第一刷_Merge Intervals
  8. android开发练习:天气应用
  9. matlab配置VLFeat
  10. android开发入门教程
  11. 阿里云大学双11特惠活动
  12. python通过正则匹配指定字符开头与结束提取中间内容
  13. Adobe ColdFusion
  14. 赵明称荣耀2022年全球销量有望翻倍;微软完成197亿美元收购Nuance | 美通社头条...
  15. 【Java】继承、多态、接口
  16. linux小红帽网卡设定,linux下网卡如何开启flow control
  17. 出战卡不足_特种部队TCG的不足之处和改进方案
  18. [青少年CTF]弱口令实验室招新赛部分WriteUp
  19. 天合光能高纪凡的光伏崛起之路
  20. 代码中统计时间(计时)

热门文章

  1. 使用Sqlmap对dvwa进行sql注入测试(初级阶段)
  2. Linux下快速安装MySQL教程
  3. 计算机在输电线路设计中的应用研究,计算机在输电线路基础设计中的应用原稿(备份存档)...
  4. 8-[函数]-嵌套函数,匿名函数,高阶函数
  5. springboot启动太慢优化
  6. servlet中web.xml配置详解
  7. USB设备驱动之设备初始化(设备枚举)
  8. BZOJ 1137 半平面交
  9. jQuery.Event的一些用法
  10. 前端MVC框架之 Angular