-
安装必要模块
npm i passport-jwt -s
-
建立passport验证token模块
//引入passport-jwt模块
const JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt
const mysql = require('mysql')
const connection = require('./mysql')
var opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken() //通过配置信息来生成jwt的请求,验证这个token
opts.secretOrKey = "kuaidian"
module.exports = passport => {
passport.use(new JwtStrategy(opts, function (jwt_payload, done) {
const sql = "SELECT * FROM users WHERE username = '"+ jwt_payload.username+ "' or phonenum = '"+ jwt_payload.username + "'"
connection.query(sql, (err, rows, fields) => {
if (err) {
console.log('[query] - :' + err);
return res.json("{ success: false, message: '登录失败!' }")
}
if(rows){
return done(null,rows)
}else{
return done(null,false)
}
})
}));
}
-
JWT签名
router.post('/login', (req, res, next) => {
const username = req.body.username
// 逻辑加密
const password = md5(md5(req.body.password))
const sql = "SELECT * FROM pre_common_member WHERE username = '" + username + "' or phonenum = '" + username + "' and password ='" + password + "'"
connection.query(sql, (err, rows, fields) => {
if (err) {
console.log('[query] - :' + err);
return res.json("{ success: false, message: '登录失败!' }")
}
if (rows != '') {
//jwt签名生成token
const rule = { username: username }
const keys = 'kuaidian'
jwt.sign(rule, keys, { expiresIn: 60 * 8 }, (err, token) => {
if (err) throw err
res.json({ success: true, message: '成功登录!', username: username, token: "Bearer " + token })
})
} else {
return res.json({ success: false, message: '登录失败!账号或密码错误。' })
}
})
})
-
JWT token 验证
//使用建立好的passport验证token中间件验证token后返回数据
router.get('/userInfo', passport.authenticate("jwt", { session: false }), (req, res, next) => {
res.json({
tag: req.user[0].tag,
username: req.user[0].username,
type: req.user[0].type,
phonenum: req.user[0].phonenum,
qq: req.user[0].qq,
address: req.user[0].address,
name: req.user[0].name
})
})