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