使用Window.postMessage将身份验证令牌发送到嵌入式应用

时间:2019-01-30 20:55:18

标签: authentication oauth oauth-2.0 postmessage

请考虑以下情形。

网站foo.com上有一个应用程序商店。开发人员可以在此注册他们的应用。一个应用程序由一个ID,徽标,URL和一组权限组成。

用户可以浏览应用商店并激活应用。通过激活该应用程序,他们接受该应用程序可以使用给定的权限代表他们执行操作。激活应用程序后,会在菜单中为他们提供带有应用程序徽标/标识的图标。它还会生成并保存具有所述权限的身份验证令牌。

点击应用后,相应的应用网址就会加载到iframe中。到目前为止,一切都很好。现在,该应用程序需要一种方法来代表用户在foo.com上实际采取行动。为此,父窗口使用window.postMessage将auth令牌发送到包含应用程序的iframe。

应用程序网址上的html必须包含一小段JS,以侦听来自父窗口的auth令牌。一旦获得令牌,它就可以将其保存在cookie /会话存储/任何内容中,并继续呈现应用并代表用户进行呼叫。

(注意:我没有指定auth令牌。它可以是oAuth访问令牌或JWT或其他任何东西。)

现在的问题是:这是一个多么可怕且令人难以置信的不安全主意?

替代的“标准”方法是让应用url启动3腿式oAuth身份验证方案,该方案会将用户重定向回foo.com(在iframe中,因此现在在foo.com中是foo.com)以接受该应用程序(由于用户已经接受了该应用程序,因此您可以自动执行此操作),然后foo.com将使用授权码重定向回该应用程序网址,它可以交换访问令牌。

我认为建议的postMessage流更简单,更简洁。我看不到什么缺点?

很明显,这不是识别第三方应用程序的灵丹妙药。仅在授权服务器控制第三方应用程序的加载的情况下才有效。

1 个答案:

答案 0 :(得分:0)

如果auth令牌可被javascript访问,则它们容易受到XSS攻击。这就是为什么auth cookie具有httpOnly标志,以防止JS与之交互的原因。

对第三方应用程序的XSS攻击可能会泄露该特定第三方应用程序的应用程序身份验证令牌。

对foo.com的XSS攻击可能会泄露所有应用程序身份验证令牌。

标准的三足式oAuth流程以第三方后端向浏览器发出的内容结束,该内容将浏览器认证为相应的oAuth凭据。如果这是httpOnly cookie,则它更安全,因为它不易受到XSS攻击。

而且,即使XSS风险可以接受,您仍然会遇到CORS问题,因为浏览器将在第三方域向foo.com发出请求