生成並驗證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就行了


@_@

相關文章
相關標籤/搜索