在JS web应用程序中,如何确保具有访问令牌的恶意用户无法刷新它

In JS web apps, how is it ensured that a malicious user with the access token will not be able to refresh it?

本文关键字:访问令牌 恶意 用户 刷新 确保 应用程序 web JS 何确保      更新时间:2023-09-26

我发现用JS应用程序确保OAuth的安全非常烦人:(


让我们假设我是Alice,一个合法用户,使用OAuth服务器的JS单页应用程序客户端。我已登录并收到我的令牌(访问和刷新)。

不幸的是,在某个时刻,我仍然有效的访问令牌和刷新令牌被恶意用户Bob检索到(请注意,没有理由只检索刷新令牌,因为OAuth服务器以相同的方式发回这两个令牌)。

好吧,所以我从这个问题中了解到,好吧,这没那么重要,因为邪恶的Bob只有有限的时间做坏事,因为代币的寿命很短。

现在让我们假设令牌已经过期。理论上,对于Bob来说,一切都应该结束了。

但我不明白现在是什么阻止了Bob请求新令牌。Alice有什么,而Bob没有,所以只有爱丽丝才能获得新的访问令牌?


现在让我们考虑一下稍微不同的客户端配置:仍然有一个JS web应用程序,但这次实际的OAuth客户端是JS客户端向其发出请求的PHP后端。这个PHP后端充当一种代理,与任何OAuth客户机一样,向OAuth服务器发出/转发请求。

在这种情况下,刷新令牌可能由后端保密,Bob将只检索访问令牌。但是,在这种情况下,除了这个现已过期的访问令牌之外,Bob确实知道,Alice可以向后端提供什么数据,以便区分她和Bob,从而只为Alice执行刷新过程?

对于JavaScript应用程序(SPAs),您应该使用隐式授予,它不支持刷新令牌。基本上,您的用户被重定向到身份验证服务器,登录并获取访问令牌。当访问令牌过期时,他们需要向身份验证服务器重新进行身份验证。

由于您不能在JavaScript应用程序中保守秘密,因此没有客户端ID或秘密:

隐式授予类型不包括客户端身份验证,并且
依赖于资源所有者的存在和
的注册重定向URI。