我有一个与我的REST
api交互的网络应用。我决定进行一些oauth
身份验证,并且遵循了一些有关如何实现它的教程,但是我仍在努力理解为什么它很安全或如何使它变得安全。
我的实现是这样的...
1. client makes request to Facebook
2. client clicks `allow access`
3. Facebook redirects back to client with code in URL
4. client makes a POST request of the code to the REST API
5. REST API authenticates code via a request to Facebook using the secret key
6. Success/fail response to client from REST API
我的问题是,这如何确保安全?据我所知,代码已保存在浏览器的URL中,因此某些恶意代码可以提取此代码。如果恶意代码可以在代码失效之前弄清哪个REST调用对其进行了身份验证,则他们可以将自己身份验证为其他人并可以访问其数据。
我的实现有可能是错误的,但是,我和其他教程一样,都尽我所能地遵循了diagram。
如果我的方法不正确,该怎么做才能确保安全?
答案 0 :(得分:2)
一会儿我会回答您的问题,但首先让我说一些准备。
Oauth与授权有关,而不是验证。将问题中的“认证”更改为“授权”。
不是用户单击“允许访问”,而是用户。 Oauth的要点是用户希望在不向客户端提供密码的情况下授予客户端对其某些数据的访问权限。 Oauth允许他使用他信任的浏览器执行此操作,因此用户可以放心使用客户端。
在没有Ouath协议的情况下,他能够执行此操作的唯一方法是将其密码提供给客户端。想象一下,您每天要使用许多客户端来访问您的Facebook数据-如果没有Oauth,您将不得不在这些客户端中输入Facebook凭据,这将使他们能够完全访问您的所有Facebook。您对此感到满意吗?您不应该这样做,因为它会打开各种恶意软件滥用之门。 Oauth允许限制这些客户端可以从您的Facebook帐户(或任何帐户)访问的内容,因此您可以对正在使用的应用程序充满信心。
现在,您的问题是URL中代码的风险。这确实是一个有效的问题,但这是一次性使用的(它被交换为用于多次访问的访问令牌),并且使用寿命很短。 Section 3.4 of the Oauth threat model中说明了使用授权码的原因。 Section 4.4.1.1 of the Oauth threat model解决了您所要询问的确切问题:
o根据核心OAuth规范,授权服务器以及 客户必须确保这些传输受到保护 使用传输层机制(例如TLS)(请参阅第5.1.1节)。
o授权服务器将要求客户端进行身份验证 尽可能将授权“代码”绑定到 某些客户可以通过可靠的方式进行验证(请参见 5.2.4.4节)。
o将较短的到期时间用于授权“代码”(部分 5.1.5.3)。
o授权服务器应强制一次使用 限制(请参阅第5.1.5.4节)。
o如果授权服务器观察到多次尝试兑换 一个 授权“代码”,授权服务器可能要撤消 根据授权“代码”授予的所有令牌(请参阅 5.2.1.1节)。
o在没有这些对策的情况下,缩小范围 (第5.1.5.1节)和有效期限(5.1.5.3节)进行访问 令牌可用于减少泄漏时的损害。o客户端服务器可以重新加载重定向URI的目标页面 以便自动清理浏览器缓存。
现在,RFC 7636中发布的Oauth协议得到了增强,可以防止其他客户端窃取移动设备上特定客户端的授权代码。有关更多详细信息,请参见RFC。