如何在我的所有请求查询字符串中包含 JSON webtoken
Posted
技术标签:
【中文标题】如何在我的所有请求查询字符串中包含 JSON webtoken【英文标题】:How to include JSON webtoken in all my request query string 【发布时间】:2018-02-04 08:33:42 【问题描述】:我刚刚学会了如何使用 JSON webtoken。我已经能够在登录时生成 JSON Webtoken,还可以设置中间件来验证我的令牌并保护低于 JSON 验证中间件的路由。
每次我尝试访问受保护的路由时,我都会通过在 GET 请求的末尾添加:?token=gwt3r7r....
来手动包含令牌。
我知道在真正的应用程序中不应该是这种情况。我希望这是动态完成的。
如何动态完成?
【问题讨论】:
提示: 发送令牌时不要使用查询参数,而是使用 http 标头,例如Authorization: <token>
你是如何向服务器发出请求的?
是的,我正在向服务器发出请求。
我在问how
,您是在使用邮递员进行测试,还是使用 jquery ajax 或其他一些 npm 包(如 axios
、fetch
、request
、http
或还有什么?
抱歉造成误解。我正在从我的网络浏览器发送 http 请求。 Web 浏览器已连接到我的本地服务器。我还安装了邮递员并连接到我的本地服务器。我用两个测试
【参考方案1】:
提示:不要使用查询参数来发送令牌,而应该使用 HTTP 标头来完成此任务。
从使用你的 nodejs api 的前端应用程序,你可以使用像 axios 这样的包向你的服务器发出请求。
当用户成功登录后,您可以使用
axios.defaults.headers.common['Authorization'] = token;
要为以后的每个请求设置默认令牌,请使用此包。
更新 #1
在邮递员中,您只需按ctrl + s
即可保存您的请求以及令牌以供将来使用。对于标题,他们有Header presets
。
您可以将常用的标题一起保存在标题预设中。在“标题”选项卡下,您可以通过从右侧的“预设”下拉列表中选择“管理预设”来为您的请求添加标题预设。
您可以参考this link,进一步了解如何充分发挥邮递员的潜力。
【讨论】:
【参考方案2】:将令牌放入 URL 不是一个好习惯。
将令牌作为Authorization
header 更好,但是如果每次发送HTTP请求之前都必须组装这样的header,那将是乏味的。此外,此解决方案仅适用于 Ajax 请求,在访问新 URL/页面时不起作用(页面保护) - 如果用户手动访问 /secure/my-account
页面会发生什么?在页面重定向之前没有机会定义请求标头。
要在所有HTTP请求中自动包含jwt令牌,您可以在登录成功时将其作为Cookie:
res.cookie('token', newToken);
这样token
Cookie通过Set-Cookie
响应头存储在浏览器中,并自动发送到服务器。
在服务器端,要从每个 HTTP 请求中获取令牌,可以使用以下函数:
var getTokenFromRequest = function(req)
if (req.cookies.token)
return req.cookies.token;
return null;
;
【讨论】:
【参考方案3】:实际上,在 url 末尾添加 jwt 令牌并不是一个好习惯。您应该将其作为 headers 传递。
您可以做的是,您可以将它作为Authorization
标头传递,并且在节点js 端您可以获得它,如果您执行以下行:
var token = req.headers['Authorization']
【讨论】:
以上是关于如何在我的所有请求查询字符串中包含 JSON webtoken的主要内容,如果未能解决你的问题,请参考以下文章