Node.js中为Express API所有出站请求自动附加JWT授权令牌的方法
自动给Express出站请求附加JWT令牌的解决方案
嘿,这个需求太常见了!每次手动加令牌确实麻烦,给你几个适配你当前用的node-rest-client的方案,也可以看看其他更便捷的思路:
方案1:利用node-rest-client的请求拦截器
node-rest-client本身支持请求拦截器,能在每次发送请求前自动修改请求配置,刚好适合用来动态添加最新的JWT令牌。
你可以在创建Client实例的时候,添加一个请求拦截器,在里面获取最新的令牌(比如从缓存、数据库或者专门的令牌接口刷新),然后注入到请求头里:
'use strict'; const router = require('express').Router(); const Client = require('node-rest-client').Client; // 封装一个获取最新JWT令牌的函数 const getLatestToken = async () => { // 这里写你的令牌刷新逻辑:比如调用令牌接口、读取缓存等 // 示例:假设从某个接口获取新令牌 // const response = await fetch('http://your-token-service/refresh'); // return response.json().token; return 'your-fresh-jwt-token'; }; // 创建Client并添加请求拦截器 const client = new Client(); client.interceptors.request.use(async (requestConfig) => { // 获取最新令牌 const token = await getLatestToken(); // 给请求头添加Authorization requestConfig.headers = requestConfig.headers || {}; requestConfig.headers.Authorization = `Bearer ${token}`; return requestConfig; }); router.get('/api/request', async function (req, res) { try { const args = { // 你的请求参数,比如data、headers(这里不用加Authorization了) }; client.post("http://localhost:3000/client", args, function (data, response) { // 处理响应 res.send(data); }); } catch (err) { res.status(500).send('请求出错:' + err.message); } }); module.exports = router;
方案2:封装通用请求工具函数
如果觉得拦截器不够灵活,你可以封装一个自己的请求函数,把“获取令牌+发送请求”的逻辑整合在一起,每次调用这个函数就行:
'use strict'; const router = require('express').Router(); const Client = require('node-rest-client').Client; const client = new Client(); // 通用请求函数 const sendAuthenticatedRequest = async (method, url, args = {}) => { // 获取最新令牌 const token = await getLatestToken(); // 注入Authorization头 args.headers = args.headers || {}; args.headers.Authorization = `Bearer ${token}`; // 返回Promise,方便异步处理 return new Promise((resolve, reject) => { client[method](url, args, (data, response) => { if (response.statusCode >= 400) { reject(new Error(`请求失败:${response.statusCode}`)); } else { resolve(data); } }).on('error', reject); }); }; // 封装获取令牌的函数 const getLatestToken = async () => { // 你的令牌刷新逻辑 return 'your-fresh-jwt-token'; }; router.get('/api/request', async function (req, res) { try { const args = { /* 请求参数 */ }; const data = await sendAuthenticatedRequest('post', "http://localhost:3000/client", args); res.send(data); } catch (err) { res.status(500).send('请求出错:' + err.message); } }); module.exports = router;
额外建议:考虑换成axios
如果后续可以更换HTTP客户端,axios的拦截器机制会更成熟易用,代码也更简洁:
const axios = require('axios'); // 添加请求拦截器 axios.interceptors.request.use(async (config) => { const token = await getLatestToken(); config.headers.Authorization = `Bearer ${token}`; return config; }); // 之后直接用axios.post/get就自动带令牌了 router.get('/api/request', async (req, res) => { try { const response = await axios.post("http://localhost:3000/client", { /* 数据 */ }); res.send(response.data); } catch (err) { res.status(500).send(err.message); } });
这些方案都能帮你避免手动重复添加令牌的麻烦,而且能保证每次请求用的都是最新的有效令牌~
内容的提问来源于stack exchange,提问作者niku
相关产品推荐
相关产品推荐

