Node中使用token(基于第三方包jsonwebtoken)

一、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

写了cookie阻止通过输入地址直接访问下一个html,但是直接输入地址访问时,会闪一下下一个页面,怎么回事啊????、...

描述:做了两个页面login.html index.html 在index的body加了onload事件,调用一个js,js中有cookie的判断,防止没有登录就打开index.html,如果没有登录跳回到login.html 但是!!!&am…

concurrently同时开启多个监听服务

当我们使用nodejs和vue混合开发的时候。当要同时启动后台服务,和前端服务的时候,我们可以使用concurrently 一、安装concurrently包 npm install concurrently --save-dev 二、配置 配置vuecli创建的项目中的packag.json文件: 2. 配置node…

es6 数组合并_JavaScript学习笔记(十九)-- ES6

ES6新增的内容之前的都是 ES5 的内容接下来我们聊一下 ES6 的内容let 和 const 关键字我们以前都是使用 var 关键字来声明变量的在 ES6 的时候,多了两个关键字 let 和 const,也是用来声明变量的只不过和 var 有一些区别1、let 和 const 不允许重复声明变…

常用的加密解密算法

import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;/*** Java常用的对密码加密的方法 对摘要信息进行加密编码*/ public class PasswordUtil {private final static String[] hexDigits { "0", "1", "2", &q…

vue-cli4.x 中 配置允许跨域请求

在项目根目录下创建vue.config.js文件: vue.config.js: module.exports {devServer: {host: localhost,port: 8080,https: false,open: false, // 配置自动启动浏览器hotOnly: true, // 是否热更新proxy: {/api: { // 路径中有 /api 的请求都会走这个代理target: …

怎样不停请求接口实现实时刷新_快狗打车实时数仓和基于Hologres的数据服务建设...

前言 数据的实时化是最近几年数据行业很重要的趋势,我们在去年底也建立起新一代的实时数仓,但是在数据应用上一直没有取得很大的突破,我们希望实时数仓不仅仅是支撑大屏、核心实时报表、个别实时应用等简单的场景,希望更大…

c/c++参考文档

http://www.cplusplus.com/reference/cstdio/ 转载于:https://www.cnblogs.com/haxianhe/p/9271192.html

Vuex在项目中使用

案例1: 案例2: Token 是用户登录成功之后服务端返回的一个身份令牌,在项目中的多个业务中需要使用到 校验页面的访问权限 访问需要授权的 API 接口 … 但是我们只有在第一次用户登录成功之后才能拿到 Token。 所以为了能在其它模块中获取…

办公室分配方案python_Python自动化办公室(1),python,一

输出目录下所有文件及文件夹 创建临时文件及文件夹 输出目录下所有文件及文件夹 os模块简介 os是pyhon标准库,可以实现和操作系统有关的操作,例如创建,移动,复制文件和文件夹,文件路径和名称处理等等 注意:…

Vue移动端项目——Vant 移动端 REM 适配

Vant官方文档 Vant 中的样式默认使用 px 作为单位,如果需要使用 rem 单位,推荐使用以下两个工具: postcss-pxtorem 是一款 postcss 插件,用于将 px 单位转化为 rem lib-flexible 用于设置 rem 基准值 下面我们分别将这两个工具配…

Win7_刻录DVD

1、刻录 临时文件夹: 1.1、C:\Users\具体的用户名\AppData\Local\Microsoft\Windows\Burn 1.2、双击 插入刻录盘的光驱,直接将文件复制到 这里,实际上也就是 复制到 上面的文件夹中。 2、UltraISO 的 路径: C:\Users\33\AppData\L…

findbugs使用_FindBugs,一个帮你找bug的IDEA插件

前言 Findbugs很多人都并不陌生,Eclipse中有插件可以帮助查找代码中隐藏的bug,IDEA中也有这款插件。这个插件可以帮助我们查找隐藏的bug,比较重要的功能就是查找潜在的null指针。 在编写代码的过程中,我们可能不会一直记得检查空的引用,在我们测试时可能…

Java常量的应用

所谓常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变。 语法:final 常量名 值; 使用fianl关键字 常量名 值final String a1 "道具卡";fin…

Vue移动端项目——字体图标的使用

使用 iconfont 制作字体图标 设计师为我们单独提供了设计稿中的图标,为了方便使用,我们在这里把它制作为字体图标。 制作字体图标的工具有很多,在这里我们推荐大家使用:https://www.iconfont.cn/。 (1)登…

docker 虚拟机搭建mongodb一主一从一复制_云计算学习路线图素材课件:Docker容器应用场景分析...

Docker容器是一个开源的应用容器引擎,它能够自动执行重复性任务,例如搭建和配置开发环境,用户可以方便地创建和使用容器,还可以进行版本管理、复制、分享、修改。有很多初学云计算的同学不清楚Docker容器的使用方法以及应用场景&a…

Vue项目中 css样式的作用域(深度作用选择器)

vue官方文档 父组件对子组件设置的样式,只能作用到子组件的根节点上!!!

沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展...

1、编译安装apache2.4.20 1 第一步: ./configure --prefix/usr/local/httpd --enable-so 2 第二步: make 3 第三步: sudo make install 2、编译安装libiconv 到这去下载,并编译安装 http://www.gnu.org/so…

git 提交文件_git原理与实战

一,序言之前在工作中也接触过git,但是没有在现公司这里用的功能这么多。主要的差异体现在如下两个方面:1,之前公司使用git主要基于图形用户界面,这对于处理冲突非常有帮助,不太容易改错地方;而现…

CSS——设置第一个以外的元素样式:not(:first-child),设置最后一个除外的元素样式:not(:last-child)

设置第一个以外的元素样式:not(:first-child),设置最后一个除外的元素样式:not(:last-child)

CPU结构与指令执行过程简介

CPU(Central Processing Unit)是计算机中进行算术和逻辑计算处理指令的主要部件. CPU结构 CPU由通用寄存器组,运算器,控制器和数据通路等部件组成. 寄存器包括 数据寄存器: AX,BX,CX,DX; 指针与变址寄存器:SP, BP, SI,…