51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Node 生成并验证token(jsonwebtoken+passport(-jwt)依赖)

文章已同步至掘金:https://juejin.cn/post/6844903934289674253
欢迎访问😃,有任何问题都可留言评论哦~

生成 并 验证 token 所需要的依赖以及步骤:

在我们登录成功的话,我们需要服务器给我们返回一个 token ,然后客服端每次访问服务器的页面的时候,都需要带着这个 token 才能访问页面并调用接口

token就是一个令牌 或 钥匙
如果登录成功了,你需要带着这个令牌去访问别的接口,有的接口是需要有令牌才能访问,没有令牌是不能访问的

安装需要的依赖:

npm i passport  

npm i passport-jwt

`npm i jsonwebtoken
`

生成token {#%E7%94%9F%E6%88%90token}

在登录的JS文件里引入

//引入
const jwt = require('jsonwebtoken')
`//引入密钥,下面验证token时有介绍
const keys = require('../../config/keys')
`

登录成功后需要生成token,下面的代码是你实现登录逻辑,并且登录成功后使用

//可以把用户信息作为一个token
const rule = {
	/* 用户信息 */
}
//参数:第一个表示用户信息,第二个表示密钥,第三个表示token存活周期
jwt.sign(rule,keys.secretOrkey,{expiresIn:3600},(err,token)=>{
	if(err) throw err
	//给前端返回状态和生成的token(下面token的书写是固定格式,不能更改)
	res.json({
		code:1,
		token:'Bearer '+token
	})
})

验证token {#%E9%AA%8C%E8%AF%81token}

在JS入口文件server.js中引入passport并配置

const passport = require('passport')
`// 配置passprot
app.use(passport.initialize());  // 初始化passport
require("./config/passport")(passport)  //导入配置文件(下面的config文件夹是配置文件),并把passport传过去
`

此配置需要放到最下面(监听端口前面),要不然会报错(不知道为什么),例如:

/****************上面都是代码********************/
//一级路由
app.use('/api/users', users)
app.use('/api/profile', profile)

// 配置passprot
app.use(passport.initialize());  // 初始化passport
require("./config/passport")(passport)  //导入配置文件

`const port = 3000
app.listen(port, () => {
console.log(``Server is running on ${port}``);
})
`

在项目下新建一个文件夹config,用来配置passport

config文件夹下新建文件 keys.jspassport.js

keys.js文件代码:

//secretOrkey就是自己设置的密钥
module.exports = {
    secretOrkey:'secret'
}

passport.js文件代码:

// 专门用来配置Passport  验证jwt   配置的话,搜索passport-jwt
const JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt = require('passport-jwt').ExtractJwt;
//引入keys文件
const keys = require('../config/keys')
//引入mongoose
const mongoose = require('mongoose')

//把数据库创建model后的文件引进来,为了查找用户
const User = require('../model/User')


let 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)  // 保存了解析后的用户信息
//根据引进来的model从数据库里查找该用户的信息,并返回
User.findById(jwt_payload.id).then(user => {
if (user) {
return done(null, user) //返回用户信息
}
return done(null, false)
}).catch(err => console.log(err))
}));
}
`


上面引入数据库创建model后的文件怕大家不理解,给出里面的代码:

const mongoose = require('mongoose')
const Schema = mongoose.Schema
`const UserSchema = new Schema({
name:{
type:String,
required:true
},
email:{
type:String,
required:true
},
password:{
type:String,
required:true
},
})
const User = mongoose.model('User',UserSchema)
module.exports = User
`

这和mongoose的模块化使用有关


如果哪个api文件夹下的JS接口文件里需要你带着token并且需要验证token的话,需要这样:

//引入passwort
const passport = require('passport')

//在这个接口后面加passport.authenticate('jwt',{session:false})

`router.get('/current',passport.authenticate('jwt',{session:false}),(req,res)=>{
res.json({
/* 数据 */
})
})
`

所以说,当访问/current时,需要带着token来访问

当客户端带着token来访问了,验证token是否合法,如果合法,我们可以从这个token中得到信息,把信息给返回

所以我们需要登录成功后带上token去访问

并且利用passport来验证token是否合法

如果没有带上token去访问/current, 人家返回的是Unauthorized

如果配置好了,那么我们后面哪个接口需要验证token,那么就在这个接口后面加 passport.authenticate("jwt",{session:false}),并引入passport就好了


@@ {#%40%40}

赞(2)
未经允许不得转载:工具盒子 » Node 生成并验证token(jsonwebtoken+passport(-jwt)依赖)