生成 并 验证 token
所须要的依赖以及步骤:前端
在咱们登陆成功的话,咱们须要服务器给咱们返回一个 token
,而后客服端每次访问服务器的页面的时候,都须要带着这个 token
才能访问页面并调用接口web
token就是一个令牌 或 钥匙
若是登陆成功了,你须要带着这个令牌去访问别的接口,有的接口是须要有令牌才能访问,没有令牌是不能访问的数据库
安装须要的依赖:npm
npm i passport
npm i passport-jwt
npm i jsonwebtoken
复制代码
token
在登陆的JS文件里引入json
//引入
const jwt = require('jsonwebtoken')
//引入密钥,下面验证token时有介绍
const keys = require('../../config/keys')
复制代码
登陆成功后须要生成token
,下面的代码是你实现登陆逻辑,而且登陆成功后使用api
//能够把用户信息做为一个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
并配置bash
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
session
在config
文件夹下新建文件 keys.js
和 passport.js
app
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
就行了