目 录CONTENT

文章目录

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

俊阳IT知识库
2023-02-15 / 0 评论 / 0 点赞 / 225 阅读 / 1,091 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-03-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告

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

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

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

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

安装需要的依赖:

npm i passport  

npm i passport-jwt

npm i jsonwebtoken

生成token

在登录的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

在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就好了


@_@

0

评论区