学习资源

整体思路:

  1. login的时候,生成并返回token给前端
  2. 前端向后端发送请求时,在header中带上authorization: token
  3. 在请求中,使用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'))
最后编辑:2021年05月18日 ©著作权归作者所有

发表评论