生活随笔
收集整理的這篇文章主要介紹了
Node中使用token(基于第三方包jsonwebtoken)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、jsonwebtoken 用于生成token(加密)
> jsonwebtoken
1. 安裝
npm i jsonwebtoken --save
2. 使用
2.1 引入
2.2 加密
用戶登錄成功后,后端生成token,返回給前端
二、passport、passport-jwt 用于驗(yàn)證token(解密)
passport-jwt和passport中間件來驗(yàn)證token
passport-jwt是一個(gè)針對(duì)jsonwebtoken的插件,passport是express框架的一個(gè)針對(duì)密碼的中間件
passport-jwt
安裝: npm i passport-jwt passport --save
在server.js 入口文件中,引入passport
初始化passport,并引入passport.js文件
在passport.js文件中,具體配置passport
const JwtStrategy
= require('passport-jwt').Strategy
,ExtractJwt
= require('passport-jwt').ExtractJwt
;
const {User
} = require('../models/User.js')
const keys
= require('../config/db.js')
const 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
)}));
}
1)請(qǐng)求/current時(shí),請(qǐng)求體帶上token的情況:
2)請(qǐng)求/current時(shí),請(qǐng)求頭沒有帶上token的情況:
在users表中,添加一個(gè)字段用于權(quán)限認(rèn)證,
然后接口代碼users.js做如下修改:
注冊(cè)時(shí),填寫identify身份字段,注冊(cè)成功后返回用戶的基本信息:
用戶輸入正確的email和password成功登錄之后,給前端返回token
前端請(qǐng)求需要登錄之后才能訪問的接口時(shí),需要在請(qǐng)求頭中加上token,攜帶上token信息,否則無法拿到接口返回的數(shù)據(jù)。
const express
= require("express")
const router
= express
.Router()
const bcrypt
= require("bcrypt")
const gravatar
= require('gravatar')
const jwt
= require('jsonwebtoken')
const keys
= require('../../config/db.js')const passport
= require('passport')const User
= require('../../models/User')router
.get("/test", (req
, res
) => {res
.json({ msg
: "login works" })
})
router
.post("/register", (req
, res
) => {console
.log(req
.body
)User
.findOne({email
: req
.body
.email
}).then((user
) => {if (user
) {return res
.status(400).json({ msg
: "郵箱已被注冊(cè)" })} else {var avatar
= gravatar
.url(req
.body
.email
, {s
: '200', r
: 'pg', d
: 'mm'});const newUser
= new User({name
: req
.body
.name
,email
: req
.body
.email
,avatar
: avatar
,password
: req
.body
.password
,identify
: req
.body
.identify
})bcrypt
.genSalt(10, function (err
, salt
) {bcrypt
.hash(newUser
.password
, salt
, function (err
, hash
) {if (err
) throw err
;newUser
.password
= hashnewUser
.save().then((user
) => {res
.json(user
)}).catch((err
) => {console
.log(err
)})});});}})
})
router
.post("/login", (req
, res
) => {const email
= req
.body
.email
const password
= req
.body
.passwordUser
.findOne({email
: email
}).then((user
) => {if (!user
) {return res
.status(404).json({msg
: '用戶不存在!'})}bcrypt
.compare(password
, user
.password
).then((isMatch
) => {if (isMatch
) {const rule
= {id
: user
.id
, name
: user
.name
,avatar
: user
.avatar
,identify
: user
.identify
}jwt
.sign(rule
, keys
.secretOrKey
, {expiresIn
: 3600}, (err
, token
) => {if (err
) throw err
;return res
.json({success
: true,token
: "Bearer " + token
})})} else {return res
.status(400).json({msg
: '密碼錯(cuò)誤!'})}})})})
router
.get("/current", passport
.authenticate('jwt', {session
: false}), (req
, res
) => {const {_id
,name
, email
, avatar
, identify
, date
} = req
.userres
.json({id
: _id
,name
: name
,email
: email
,avatar
: avatar
,identify
: identify
,date
: date
})
})module
.exports
= router
總結(jié)
以上是生活随笔為你收集整理的Node中使用token(基于第三方包jsonwebtoken)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。