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
安装:
npm i passport-jwt passport --save
在server.js 入口文件中,引入passport
初始化passport,并引入passport.js文件
在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做如下修改:
- 注册时,填写identify身份字段,注册成功后返回用户的基本信息:
- 用户输入正确的email和password成功登录之后,给前端返回token
- 前端请求需要登录之后才能访问的接口时,需要在请求头中加上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)相关推荐
- golang中go mod使用第三方包
go mod init #在代码中引入第三方包之后执行下面的命令 go mod download go run xxx.go
- Python中矩阵运算(基于numpy包)
1 乘法 在数组中,a * a计算对应元素相乘(矩阵点乘):在矩阵中,A*A计算矩阵乘法 np.multiply()计算对应元素相乘(矩阵点乘) np.dot()计算矩阵乘法 import numpy ...
- python 第三方包自动导入_7行代码,彻底告别python第三方包import导入问题!
最近有不少小伙伴咨询关于pyton第三方包导入的问题,今天我们就来聊聊第三方包导入那些事. 随着对python学习的渐入臻境,越来越多的小伙伴们开始导入自己所需的第三方包,实现各种各样的功能.但是,他 ...
- node --- 在node中使用mongoosemongoDB的安装
*首先确保,你的电脑安装了mongodb,网址: mongodb官网 *使用npm安装 mongoose: mongoose官网 ps:mongoose是Node中操作mongoDB的第三方插件.用于 ...
- node中模板引擎、模块导出、package.json简介
在node.js中使用引擎模板: art-template不仅在浏览器可以使用,也可以在node中使用,并且模板引擎起早诞生于服务器领域,在node中使用模板引擎: 1.安装:在一个文件目录下执行命令 ...
- python怎么安装第三方库-vs2017怎么安装python第三方包
vs2017有独立的python环境:所以想在vs2017开发python并使用第三方包,需要在vs2017中操作,完成第三方包的安装. 一,查看vs2017有哪些版本的python,当前使用的是哪个 ...
- vs2017怎么安装python包,vs2017安装pygame,vs2017安装python第三方包
vs2017有独立的python环境:所以想在vs2017开发python并使用第三方包,需要在vs2017中操作,完成第三方包的安装. 一,查看vs2017有哪些版本的python,当前使用的是哪个 ...
- PHP常用第三方包,php第三方包管理
前言 在编写程序的时候,我们会用到别人的第三方包,俗称轮子.如何正确引入一个第三方的包,且正确合理的放置,是一个值得规范的事情. 传统的包引入include "the/path/of/fil ...
- Node.js中创建package.json文件,安装第三方包
在当前项目根目录下打开命令窗口 输入,开启安装向导 npm init 依次输入之后即可生成package.json文件,也可以不完全填写全部信息,不想填的回车可跳过. package name: (包 ...
最新文章
- android帧动画实现方法之一
- Re-installation failed due to different application signatures
- 在windows 2008/2012中配置RADIUS 客户端计算机上网WiFi 认证
- 与kylin_Kylin 迁移到 HBase 实践在小米的实践
- android反编译之获得res下的xml配置文件及图片等资源
- linux usr目录权限不够,【ARM-Linux开发】Ubuntu下的/usr目录权限,导致不能使用sudo命令的修复...
- leetcode第一刷_Merge Intervals
- android开发练习:天气应用
- matlab配置VLFeat
- android开发入门教程
- 阿里云大学双11特惠活动
- python通过正则匹配指定字符开头与结束提取中间内容
- Adobe ColdFusion
- 赵明称荣耀2022年全球销量有望翻倍;微软完成197亿美元收购Nuance | 美通社头条...
- 【Java】继承、多态、接口
- linux小红帽网卡设定,linux下网卡如何开启flow control
- 出战卡不足_特种部队TCG的不足之处和改进方案
- [青少年CTF]弱口令实验室招新赛部分WriteUp
- 天合光能高纪凡的光伏崛起之路
- 代码中统计时间(计时)