jwt on node - 客户端如何将令牌传递回服务器

Posted

技术标签:

【中文标题】jwt on node - 客户端如何将令牌传递回服务器【英文标题】:jwt on node - how does the client pass the token back to the server 【发布时间】:2015-11-01 13:45:28 【问题描述】:

好的。

我认为我没有理解基于令牌的身份验证的基本部分。

我正在使用带 express 的 node,如果您尚未登录,我正在使用 jwt 来阻止访问我的网站。我可以在登录页面上创建一个令牌,然后我可以将其发送回客户端并将其存储在本地存储/cookie。现在,如果用户想要导航到另一个页面,他们将输入一个 url 并触发一个 get 请求。

在加载页面作为获取请求的一部分之前,如何从 localStorage/cookie 访问该令牌并将其传递给服务器。我的假设是应该有一种方法将令牌传递给服务器 - 在中间件中拦截它 - 如果令牌是合法的,则加载页面,或者如果令牌未正确验证,则重定向到登录页面。

在发布请求时,这会简单得多,因为您可以在页面加载后获取令牌并将其作为 ajax 调用的一部分传递。

我已经看到将令牌作为请求标头(授权承载)的一部分的引用。我认为这仅适用于发布,因为如果您能够将标头参数设置为“全局”,那么您为什么还要费心将客户端存储在 cookie/localStorage 中。

如您所见,我对工作流程有些困惑。似乎我以某种方式违背了粮食。任何澄清将不胜感激。

【问题讨论】:

如果您在 cookie 中发送令牌,那么它将在客户端的任何 get/post 请求中接收。 @Hiren 我已经在登录发布请求的回调中尝试了这个 document.cookie = result.token。我查看了后续获取请求中的键,例如我看不到 req.cookie。我应该在哪里寻找。 在 node.js 服务器上,您可以使用 request.headers.cookie 读取并希望您已包含 cookie-parser 模块 @Hiren - 哇,我简直不敢相信。我在 req 上记录了 res 的键 - 这就是为什么我错过了标题中的 cookie!我想我不会再回到那些时间了 :) 不过感谢您的帮助,否则我会被困在阅读博客上更多小时。 - 作为旁注 - 如果您不使用 cookie,您应该如何获取令牌? 哈哈!这就是我要问的问题,似乎没有多少机构愿意回答,我所有的搜索都达到了不集中的内容,特别排除了那部分,如何在不使用 cookie 的情况下将令牌从客户端发送到服务器。如果您设法从网络上如此多的分离的部分数据中理解整个工作流程,将会很高兴。 【参考方案1】:

如果您使用 localStoage 来存储 JWT,那么将其传递给服务器的最简单方法是首先使用 localStorage.getItem('token')(或任何您的令牌名称)从 localStorage 检索令牌,然后将其插入请求的标头中(它是 GET 或 POST/PUT/DELETE)。根据您用于处理客户端上的 http 请求的库,有不同的方法可以这样做。例如,在 jQuery 中,您可以在 AJAX 请求中执行以下操作:

$.ajax(
    url: API_URL + "/endpoint",
    method: "GET",
    beforeSend: function(request)
        request.setRequestHeader("Authorization", "BEARER " + localStorage.getItem('token'));
    
)

在此之后,在服务器端只需像往常一样通过访问request.header 选项来访问参数。希望这会有所帮助!

【讨论】:

按照我的理解,问题是关于什么时候 http 请求根本不是由 javascript(有或没有库)发出的,而是由浏览器本身首先加载页面。所以任何基于 JavaScript 的方法都行不通。

以上是关于jwt on node - 客户端如何将令牌传递回服务器的主要内容,如果未能解决你的问题,请参考以下文章

node js jwt如何将令牌传递给其他路由以稍后检查登录的用户信息

使用 JWT 进行环回身份验证

JWT 未解码“JWT 格式错误”-Node Angular

如何从 Flask 返回不记名 JWT 令牌?

如何在 Node.js 应用程序的客户端站点上处理 JWT 令牌?

PHP:如何使用 JWT 从 API 注销