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

生成 并 验证 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,用来配置passportsession

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

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就行了


@_@

相关文章
相关标签/搜索