2

在用户使用 google 登录(护照策略)后,在我当前的应用程序中,我在服务器上生成了一个 JWT 令牌,然后我不知道如何将其发回,同时还将用户重定向到前端网站。

在搜索时,我读到前端应该获取令牌,但这是否意味着我必须缓存 JWT 直到它被请求并设置一些带有密钥的 cookie 以在缓存中获取令牌?我试过这样做,但感觉就像我在重新发明轮子,让自己面临一些安全漏洞。

4

2 回答 2

2

不幸的是,接受的答案似乎没有回答这个问题。这是从前端(例如 Web 应用程序)发送到后端(API 或类似的)的一个很好的答案。

但我知道您想将令牌从后端发送到前端。在这种情况下,有几种方法可以传输该令牌。它们被 OAuth2 框架协议广泛使用。

使用回调 Uri

这是最常用的技术之一。后端服务器使用查询字符串中的令牌生成重定向响应(状态代码 303)。举个例子

HTTP/1.1 303 See Other
Location: http://frontend.org/?token=xxxxxxxxxxx

您还可以使用片段属性

HTTP/1.1 303 See Other
Location: http://frontend.org/#token=xxxxxxxxxxx

代码交换

另一种非常相似的方法是生成一个唯一且一次性使用的代码,该代码将使用附加请求交换令牌。

HTTP/1.1 303 See Other
Location: http://frontend.org/?code=xxxxxxxxxxx

在前端,获取代码并向后端询问令牌(使用 fetch)

POST /give/me/the/token HTTP/1.1
Host: backend.com
Content-Type: application/json

{
  "code": "xxxxxxx"
}

可能的威胁

您必须考虑几个威胁。它们在RFC6819中进行了描述,但存在缓解措施。

  • CSRF 攻击:state应使用参数(第 3.6 节
  • 打开重定向器攻击:您不应该让客户端决定重定向 URI(第 4.1.5 节

此外,您应该看看RFC7636。该规范定义了一种code通过使用在客户端生成的随机密钥来防止盗窃的方法。

于 2021-12-03T13:54:51.433 回答
2

您可以在标头中或作为有效负载发送 JWT 令牌,并且在前端,您只需在将 JWT 令牌发送到服务器时将其附加到每个请求中即可。服务器应该有逻辑在将请求传递给下一个中间件之前进行验证,如果令牌有效,则请求将被传递给下一个中间件,否则将返回未经授权的。

您可以在标头、有效负载中发送令牌、查询任何您喜欢的内容,但人们普遍将令牌附加在Authentication.

我建议您检查链接,它具有使用 Node 和 Express 发送和验证 JWT 令牌的分步流程。

您还可以检查节点并做出反应。

于 2021-12-03T07:37:21.377 回答