文章已同步至掘金: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.js
和 passport.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
就好了