oauth-2.0 – 公共客户端上的客户端身份验证

研究OAuth2.0我终于找到了这2个参考文献:

http://tools.ietf.org/html/rfc6749#section-2.3

http://tools.ietf.org/html/rfc6749#section-10.1

如我错了请纠正我:

It’s possible to use unregistered clients, but you have to manage them yourself with security risks.

>我应该如何管理?

一些更具体的问题:

> A Native Application (a Public Client indeed)不能定义安全地存储其凭据(client_id secret)。是unregistered client吗?如果我无法使用秘密进行验证/验证,还应该怎么办?
>客户端注册= / =端点注册:第一个是关于注册客户端凭据(client_id secret);第二个关于注册Client Redirection Endpoints.重定向终端注册是否足以授予客户的真实性?
> Client Credential Grant是否使用相同的凭据(client_id密码)进行客户注册?

我想你可以回答我,只是解释右边这个http://tools.ietf.org/html/rfc6749#section-10.1

请报告有关如何实施的参考资料和实例:

[…] it’s beyond the scope of this specification.

谢谢

TL;博士:

无法通过client_id和client_secret验证本机客户端。如果您需要对客户端进行身份验证,则必须实施不将委托共享密钥委托给客户端的认证方案(或者涉及最终用户进行客户端认证讨论)。根据应用程序的安全模型,您可能不需要验证客户端。
>重定向终结点通常不足以验证客户端(虽然exceptions exist)。
>“客户端凭证”授权类型可以使用授权服务器支持的任何客户端认证机制,包括客户端注册时发出的凭证。

我读到的要点是,您可以信任一个机密客户端的client_id(读取:“username”)和client_secret(读取:“密码”),以便与您的服务进行身份验证。第三方应用程序无法代表客户的凭据,因为它们被合理地假定为安全地远离窥探的存储。

然而,一个公共客户端不能保证这样的保证 – 无论是基于浏览器的应用程序还是本机桌面应用程序,客户的身份和秘密都被分发给了整个世界。假设这样的应用程序将最终掌握在熟练的开发人员和黑客身上,这些开发人员和黑客可以挖掘客户端并提取ID和秘密是非常合理的。因此,第10.1节明确规定:

The authorization server MUST NOT issue client passwords or other
client credentials to native application or user-agent-based
application clients for the purpose of client authentication.

好的。因此,无法通过密码认证公共客户端。然而…

The authorization server MAY issue a client password or other
credentials for a specific installation of a native application
client on a specific device.

这种异常工作原理是因为它将客户端的身份验证与特定设备绑定在一起,这意味着即使有人用客户端的秘密走了,他们也无法重用它。但是,在这种异常中隐含的是,“特定设备上的特定安装…”必须是唯一可识别的,难以欺骗的,也是该客户端认证过程的组成部分。

并非每个本地应用程序都可以满足这些标准,而基于浏览器的应用程序肯定不能,因为在运行环境中没有任何唯一标识或难以欺骗。这导致了几个选项 – 您可以将客户端视为未经身份验证的,或者您可以提出更合适的身份验证机制。

认证舞蹈的关键是共享的秘密 – 只有授权服务器和验证客户端才知道。对于公共客户来说,客户本身没有任何秘密。幸运的是,有选项,我不只是谈论RFID钥匙扣和生物识别(尽管那些是完全可以接受的)。

作为一个思想实验,让我们考虑一个基于浏览器的客户端。我们可以合理地假设一些事情:它在浏览器中运行,它由特定域提供,该域由客户的作者控制。认证服务器应该已经有一个客户端重定向URI,所以我们有一些东西在那里,但是根据规范的要求:

A valid redirection URI is not sufficient to verify the client's
identity when asking for resource owner authorization but can be
used to prevent delivering credentials to a counterfeit client
after obtaining resource owner authorization.

因此,重定向URI是我们应该检查的,但不是我们可以信任的东西,在很大程度上是因为域可能被欺骗。但是服务器本身是不可能的,所以我们可以尝试向该域询问只有客户端的域的服务器才能知道。执行此操作的最简单的方法是认证服务器要求与客户端相同的域上的第二个(“私有”)URI,客户端的秘密将在其上托管。当客户端应用程序发出授权请求时,服务器将相对于客户端报告的主机名的第二个URI进行“检入”,并查找共享密钥(应仅向授权服务器的IP地址披露)来验证客户。

当然,这不是一个完美的解决方案。它不适用于每个应用程序,容易出错,并且可能需要很多工作来实现。存在许多潜在的认证机制(高度特异性和高度通用性),任何不将客户端应用委托给私有数据的认证机制都适用于此问题空间。

另一个选择是不执行进一步的身份验证,并将客户端视为未认证的。这与未经注册的客户显然不一样,但差异是微不足道的。未注册的客户端是其身份未知的客户端。未经身份验证的客户端是其身份已知但不受信任的客户端。两种类型的客户端的安全隐含是相同的:不应该委托私人数据。然而,授权服务器是否选择将这两种情况相同,似乎由实施者决定。例如,API可以拒绝来自未注册客户端的所有连接,并将公开的只读内容提供给任何注册的客户端(即使不验证客户端的身份)。

然而,实用主义可能会胜出 – 未经身份验证的客户端与您浏览器无法验证网站SSL证书的真实性时偶尔会看到的SSL“错误”根本没有区别。浏览器将立即拒绝进一步的进一步说明,为什么,但用户被允许通过检查服务器的身份来接受风险。许多OAuth2应用程序可能会有类似的工作流程。

为什么验证客户的身份很重要?没有这样做,信任链就破裂了。您的应用程序的用户信任您的应用程序。授权工作流程确定您的用户还信任客户端,因此您的应用程序应该信任客户端。在不验证客户端身份的情况下,另一个客户端可以随时担任可信客户端的角色,并具有其所有的安全权限。关于客户端认证的一切都有助于防止信任的破坏。

希望这有帮助!

[1]:服务器妥协,您的应用程序的源代码陷入恶意手中,这是一个例外,并且还有其他内置的保护措施。话虽如此,该规范还专门指出,简单的用户名/密码组合不是最安全的选择:

The authorization server is encouraged to consider stronger
authentication means than a client password.
http://stackoverflow.com/questions/14574846/client-authentication-on-public-client

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:oauth-2.0 – 公共客户端上的客户端身份验证