浏览器中直接 URL 命中的 Jwt 令牌身份验证

Posted

技术标签:

【中文标题】浏览器中直接 URL 命中的 Jwt 令牌身份验证【英文标题】:Jwt token authentication for direct URL hit in browser 【发布时间】:2016-10-24 09:44:18 【问题描述】:

我有 Angular + Spring 应用程序,我尝试使用 JWT 令牌对服务进行身份验证。

在 Jwt 身份验证中,我将令牌存储在 localStorage 中,并将令牌附加到每个请求的 Authorization HTTP 标头中。这可以通过在 AngularJs 中编写拦截器来完成。我已经关注this 教程。

现在我的问题是: 如何验证通过在浏览器中点击 URL 直接发出的请求?

当您点击 URL 时,没有加载页面,也没有脚本将 URL 从 localStorage 绑定到 Authentication 标头。所以最终服务器会拒绝请求并发送 401,即使用户之前已经过身份验证。

【问题讨论】:

直接访问 URL 时,只有 cookie 会提供一种纯自动化的方式来宣布您的客户端已通过身份验证。您的服务器能否提供自定义的 401/未授权响应,注入尝试的 URL,将 JWT 从 localStorage 中拉出并发出请求?这不是最有效的方法。 我认为我无法在浏览器中点击的请求中添加标头。 即使我设法用 401 响应注入尝试的 URL 并提取 jwt 但之后..如何将标头添加到新页面请求(不是 ajax 请求)?根据this 对话,我认为这是不可能的。 【参考方案1】:

对于需要浏览器直接加载的视频、图片或文档等网络资源,在url中添加JWT参数(可以不设置headers)

  path/to/resource?jwt=...

在服务器端,如果身份验证标头不存在,则解码寻找 jwt 的 url

对于您尚未生成的传入链接,例如来自搜索引擎,

  1) accept the link and redirect user to login page with a cookie/field set to the destination page
  2) automatically, login user with JWT from local storage set in header in the usual way
  3) if it is succesful, redirect to the destination 

【讨论】:

根据您的方法,我认为我必须在服务器端编写两个条件 1)检查标头中的 jwt -> 如果它存在且有效 -> 用户已通过身份验证 2)如果标头中不存在-> 检查 jwt 的 url 参数 -> 是否存在且有效 -> 用户已通过身份验证.. 我正确吗?

以上是关于浏览器中直接 URL 命中的 Jwt 令牌身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress JWT 身份验证令牌问题

JWT 令牌基于仪表板应用程序的每个请求的身份验证

Django Rest Framework 不接受 JWT 身份验证令牌

尝试使用有效令牌直接访问页面时,JWT 身份验证不起作用;将在登录时开始工作。反应/节点/快递

Laravel 通过生成的令牌进行身份验证,无需护照和 jwt

混合身份验证 - 基于 Spring MVC 会话 + 基于 JWT 令牌