【发布时间】:2018-05-04 01:58:24
【问题描述】:
我正在使用 Express、Passport 和 jsonwebtoken 在 NodeJS 中为网站构建身份验证系统。 我到处搜索,但找不到问题的解决方案。
现在我有一个身份验证控制器:
module.exports = function() {
var strategy = new BearerStrategy(params, function(payload, done) {
var decodedToken = jwtDecode(payload)
db.default.Account.find({where: {id: decodedToken.id}}).then(account =>{
if (account) {
return done(null, {
id: account.id,
role: account.role
})
} else {
return done(new Error("User not found"), null)
}
})
})
passport.use(strategy)
return {
initialize: function() {
return passport.initialize()
},
authenticate: function() {
return passport.authenticate("bearer", cfg.jwtSession)
}
}
}
我在其中使用 BearerStrategy 并且此代码有效,因为我的 /login 路由为用户创建了一个令牌并返回该令牌
accountController.post("/login", function(req, res) {
if (req.body.email && req.body.password) {
var accEmail = req.body.email
var accPassword = req.body.password
db.default.Account.find({where: {email: accEmail, password:
accPassword}}).then(account =>{
if (account) {
var payload = {
id: account.id,
role: account.role
}
var token = jwt.sign(payload, cfg.jwtSecret)
console.log(token)
res.status(200).json({
token: 'Bearer ' + token
})
} else {
res.sendStatus(401)
}
})
} else {
res.sendStatus(401)
}
})
如果我使用 Postman 发送一个 HTTP 请求来尝试访问路由 /account 并且我将创建的令牌设置为标头,那么一切正常。
accountController.get('/account', auth.authenticate('bearer', { session: false }), function(req, res){
res.status(200).render('pages/homepage')
})
我无法回答的问题是: 用 res.json({token: token}) 发回令牌是不够的,令牌需要存储在某个地方,对吧?我应该如何使用 RestAPI 存储令牌,此外,我应该如何在每个请求的 HTTP 标头中从客户端发送令牌?
我愿意接受有关如何在存储和发送 JWT 之间建立这种连接的建议(因为 JWT 的生成和验证工作) 谢谢
【问题讨论】:
标签: jwt passport.js express-jwt