整体思路:
- login的时候,生成并返回token给前端
- 前端向后端发送请求时,在header中带上authorization: token
- 在请求中,使用jwt.verfiy去验证token的有效性,决定是否允许访问资源
当前问题:实际应用中,每次都需要使用user数据来验证token吗?user数据存储在哪里?每次从数据库里调用是不是有点影响性能呀?
答案:我仔细看了一下,好像验证token的时候,只需要token和secretKey就可以了,完全不用重新提取一遍用户数据,这可能厉害了,也就是说加密的时候已经把用户数据存在token里了?
完整代码:
const express = require('express')
const jwt = require('jsonwebtoken')
const app = express()
//登录接口,获取Token
app.post('/api/login', (req, res) => {
// 用户信息,问题:这个信息mongodb来?需要存起来吗?
const user = {
id: 1,
username: 'Alex',
email: 'alex@qq.com'
}
// 使用user信息生成token,返回前端
jwt.sign({user}, 'secretkey', { expiresIn: '30s' }, (err, token) => {
res.json({
token
})
})
})
// 需要token保护的接口,使用verfiyToken中间件验证请求是否带有token
app.post('/api/posts', verifyToken, (req, res) => {
// 使用jwt验证token是否正确
jwt.verify(req.token, 'secretkey', (err, authData) => {
if (err) res.sendStatus(403)
res.json({
message: 'Post created...',
authData
})
})
})
// 验证请求有无token,没有就返回403,有的话就获取token,放到req.token里
function verifyToken (req, res, next) {
// 获取headers里的authorization数据
const bearerHeader = req.headers['authorization']
// 如果没有authorization数据,返回403
if (typeof bearerHeader === 'undefined') res.sendStatus(403)
// 如果有,获取token,然后继续执行
const bearer = bearerHeader.split(' ')
req.token = bearer[1]
next()
}
app.listen('5000', () => console.log('server is listening on port 5000'))
最新回复