【搭建博客服务端部分】第七部分 token校验

本文介绍了如何在博客服务端实现Token校验的过程,包括设置跨域、解析JSON数据及使用中间件验证Token的有效性等内容。

【搭建博客服务端部分】第七部分 token校验



7. token校验

在app.js

const express = require('express')
const multer = require('multer')
const { db, genid } = require('./db/dbUtils')
const path = require('path')
const port = 8888
const app = express()

// 配置跨域相关
app.use(function (req, res, next) {
    // 允许跨域域名
    res.header('Access-Control-Allow-Origin', '*')
    // 允许 header类型
    res.header('Access-Control-Allow-Headers', '*')
    // 允许请求方式类型
    res.header('Access-Control-Allow-Methos', 'GET,PUT,POST,OPTIONS,DELETE')
    if (req.method == 'OPTION') {
        // 让options尝试请求快速结束
        res.sendStatus(200)
    } else {
        next()
    }
})

// 对格式为JSON的body数据进行解析
app.use(express.json())

// 支持使用上传的中间件
app.use(multer({
    dest: "./public/upload/temp"
}).any())

// 指定静态资源路径
app.use(express.static(path.join(__dirname, 'public')))

// 使用中间件对token进行校验
// 把需要校验的接口前面加上_token
const keyword_token = '/_token'
app.all('*', (req, res, next) => {
    if (req.path.indexOf(keyword_token) > -1) {
        const { token } = req.headers
        db.async.all("SELECT * FROM admin WHERE token = ? ", [token]).then(({ error, rows }) => {
            if (error != null || rows.length <= 0) {
                res.send({
                    code: 403,
                    msg: '请先登录!'
                })
            } else {
                next()
            }
        })
    } else {
        next()
    }
})

// 注册路由
app.use('/admin', require('./router/loginAPI'))
app.use('/category', require('./router/categoryAPI'))
app.use('/blog', require('./router/blogAPI'))
app.use('/upload', require('./router/uploadAPI'))

app.get('/', (req, res) => {
    res.send('xxxx')
})

app.listen(port, () => {
    console.log(`http://localhost:${port}`);
})

总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

### 服务端实现 Token 校验的方法和最佳实践 #### 使用 JWT 实现 Token 校验 JSON Web Tokens (JWT) 是一种开放标准 RFC 7519 方法,用于在网络应用环境间安全地传输信息。当用户通过用户名/密码成功登录后,服务器生成一个 JSON Web Token 并发送给客户端[^3]。 ```javascript const jwt = require('jsonwebtoken'); // 创建 token function createToken(user) { const payload = { id: user.id, username: user.username }; return jwt.sign(payload, 'your_secret_key', { expiresIn: '1h' }); } ``` 为了验证传入的 token 是否有效,可以在每次 API 请求到达时解析并检查它: ```javascript function verifyToken(req, res, next) { const bearerHeader = req.headers['authorization']; if (typeof bearerHeader !== 'undefined') { const bearer = bearerHeader.split(' '); const bearerToken = bearer[1]; jwt.verify(bearerToken, 'your_secret_key', (err, authData) => { if (err) { res.sendStatus(403); } else { req.authData = authData; next(); } }); } else { res.sendStatus(403); } } ``` 这种方法不需要将 tokens 存储在数据库中,减少了查询次数,提高了性能[^2]。 #### 整合接口签名校验与日志记录 对于更复杂的应用程序来说,除了简单的 token 验证外,还可以考虑集成其他的安全措施,比如接口签名验证以及详细的日志记录机制。这可以通过创建自定义装饰器来完成,该装饰器能够同时处理这三个方面的工作——即 SignValidation、APILog 和 TokenValidation ——并将它们封装在一个名为 ApiValidation 的单一注解内[^1]。 ```typescript import { applyDecorators, SetMetadata, UseInterceptors } from '@nestjs/common'; import { LoggingInterceptor } from './logging.interceptor'; export function ApiValidation() { return applyDecorators( SetMetadata('sign_validation', true), SetMetadata('token_validation', true), UseInterceptors(LoggingInterceptor), ); } ``` 上述代码片段展示了如何利用 NestJS 框架中的元编程特性构建复合型中间件处理器,从而简化控制器逻辑的同时增强了安全性。 #### Nginx + Lua 扩展能力 如果应用程序运行于高并发环境下,则可能需要借助反向代理服务器如 Nginx 来分担部分工作负载。Nginx 支持通过嵌入式脚本语言 Lua 对 HTTP 请求进行预处理,包括但不限于 token 校验及 URL 路由重写等功能[^4]。 ```nginx http { lua_package_path "/path/to/lua/files/?.lua;;"; server { location /api/ { access_by_lua_file /path/to/token-validation.lua; rewrite_by_lua_block { local uri_args = ngx.req.get_uri_args() -- 动态获取转发 URI ... } proxy_pass http://backend_servers; } } } ``` 这种方案不仅减轻了上游应用服务器的压力,而且提供了更高的灵活性以适应不同的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值