阿毛Alex - 2021年5月18日
type: channel
link: https://alexmao.com/index.php/2021/05/18/
description: 生命不息，折腾不止
items: Bearer Token验证登录的一个示例

Bearer Token验证登录的一个示例
type: item
date: 2021-05-18T06:43:00+00:00
description: 学习资源整体思路：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'))