使用带有 KONG API 网关的 cookie 进行 JWT 身份验证
Posted
技术标签:
【中文标题】使用带有 KONG API 网关的 cookie 进行 JWT 身份验证【英文标题】:JWT authentication using cookies with KONG API Gateway 【发布时间】:2018-02-27 01:12:03 【问题描述】:我们正在使用带有 JWT 身份验证插件的 Kong API 网关实现示例应用程序。
正如thread 中提到的,有两种方法可以在浏览器中存储 JWT。网络存储或 cookie。但是网络存储(即会话存储和本地存储)可能容易受到跨站点脚本攻击(XSS)的攻击。所以其他选择是cookie。 (虽然应该注意 CSRF)
我有两个问题,
如果我们使用 web 存储 来存储 JWT,那么有什么方法可以阻止 XSS。如果是,那么如果在新标签页中打开同一页面或重新加载同一页面,它将如何工作?
使用 cookie:我们能够在请求中发送 cookie。但 KONG 仅在 在标头上设置 (Authorisation: Bearer token
) 并且不使用 cookie 进行身份验证时才对端点 URL 进行身份验证。有什么方法可以验证使用 KONG API Gateway 在 cookie 中设置的 JWT 吗?
【问题讨论】:
【参考方案1】:将 JWT 存储在 webStorage 中没有任何问题,除非您将敏感数据存储在 JWT 中(但您永远不应该这样做,因为您可以轻松对其进行解码)。关键是您的令牌共享一个只有您的服务器知道的秘密(这就是使其安全的原因),您应该设置一个到期时间以使其更安全。
不,您不能在 cookie 中传递 JWT 令牌,它只能在标头中(此处为授权),我不知道 KONG API,但他们不应该允许这样做!
(关于 JWT 的参考是here)
【讨论】:
感谢您的快速回复。是的,你是对的。但是我们正在开发单页应用程序,那么我该如何处理重新加载/刷新页面的情况呢?如果假设我打开新选项卡,那么如何在 HTTP 请求中传递 JWT(存储在网络存储中) 所以你应该尝试localStorage
而不是webStorage
,localStorage
在域上是持久的并且可以抵抗页面重新加载/刷新!您只需将 JWT 一次传递给您的客户端(在登录时或其他任何方式),并将其保存到您的 localStorage
谢谢。那么如何将令牌从本地存储发送回 HTTP 请求。我们知道本地存储在域上是持久的。但问题是将 JWT 令牌传递给 HTTP 请求。
我不知道,这取决于您执行 http 请求的方式(使用 axios
、fetch
?)
简单地说,我正在从第一个选项卡复制 URL,例如http://localhost:3000
并粘贴到新标签中。所以我的应用程序被重定向到登录而不是前进。我想要的是当我将 URL 粘贴到新选项卡并按 Enter 键时,它应该在请求中传递令牌。希望这能理解我的担忧。【参考方案2】:
为了补充@antoine2vey的答案,
看起来您的页面应用程序正在由 Kong 中的“/”(斜杠)资源处的受保护 API 提供服务。我建议您能够从未受保护的“/”(斜杠)资源中获取页面内容,然后运行 javascript 代码将可以访问 cookie,并且能够通过 JWT 令牌执行对受保护资源的请求在 Kong 可以为您验证的标题中。
这有意义吗?
【讨论】:
您好,感谢您的回复。我会调查一次。现在我已经对 kong 的代码进行了更改以接受 cookie (github.com/Mashape/kong/pull/2363) 并且它正在运行。【参考方案3】:实现了基于 Cookie 的身份验证。 https://github.com/Kong/kong/pull/2973
【讨论】:
以上是关于使用带有 KONG API 网关的 cookie 进行 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章