如何使用查询字符串从两个 Web 应用程序安全地传递承载令牌?

Gib*_*boK 5 javascript security api

我在两个子域上托管了两个 Web 应用程序(原型),例如:

1) cms.mydomain.com 上的 CMS(用 PHP 完成)。

2) SPA - spa.mydomain.com 上的单页 Web 应用程序(用JavaScript完成)。

我的用户案例:

用户可以访问 CMS 应用程序并使用用户名和密码进行身份验证。

身份验证成功完成后,CMS 应用程序上会显示包含一些项目的网页。

用户可以选择一个项目,然后使用 SPA 应用程序在新窗口上打开

目前,在 CMS 应用程序中完成身份验证后,会创建一个不记名令牌,我们将令牌作为查询字符串传递给 SPA 应用程序,以便对用户进行身份验证。

SPA 应用程序 JavaScript 检索查询字符串和其他附加参数并执行 API 调用以运行。

笔记:

  • 我们在两个应用程序上都使用 HTTPS。
  • 只有在 CMS 中进行身份验证后才能访问 SPA 应用程序。
  • 接收令牌的 SPA 应用程序位于 .HTML 文件中,并且仅使用 JS 进行 API 调用。
  • Bearer Token 的有效期为 14 天。
  • 令牌授予对 SPA 应用程序的完全访问权限。
  • 令牌也可以使用 JS 从 CMD 传递到 SPA。
  • 令牌由第三个应用程序 api.mysite.com 生成。

我知道查询字符串中的 TOKEN 可能不安全,因为:

  • 带有查询字符串参数的 URL 保存在 Web 服务器日志中,访问它们可能会危及安全。

  • 像 Google Analytic 这样的第三方应用程序可以在他们的报告中存储这样的 URL 和查询字符串。

我想知道您对以下问题的看法:

  • 在不使用查询字符串的情况下将令牌从 CMS 传递到 APP 的安全方法是什么?
  • 我在想是否可以在 CMS 中使用Window.postMessage()将令牌作为消息发送到 SPA。您是否发现这种方法存在任何安全问题?
  • 如果使用查询字符串,我还会遇到什么其他风险(我需要说服我的团队查询字符串不是一个好方法 - 如果为真:))?
  • 你能给我指出一些额外的资源或指南吗?

谢谢你的时间。

aw0*_*w04 1

您也许可以创建一个对 SPA 的一次性访问令牌,而不是将原始不记名令牌作为查询字符串发送。

然后可以将该令牌发送到 API,进行解码并用于创建真正的身份验证令牌,但其优点是仅有效一次。现在你不再需要担心服务器日志、GA 等。我认为这是一种重定向形式来减轻这些担忧。