我们目前正在为外部生态系统中的 OAuth 进行设计。当然,这个想法是移动应用程序将使用用户凭据授予类型向 OAuth 服务器进行身份验证,以获取令牌以进行进一步的工作流。另一方面,受保护的资源服务器将使用相同的 OAuth 服务器验证令牌信息并做出相应的响应。
一切都很清楚,但有一个问题:要让它工作,我们必须交付应用程序,其中包含在代码中编译的客户端密码。这打开了一个很大的安全漏洞。有没有办法避免它,或者它甚至是一个问题?
谢谢,
我们目前正在为外部生态系统中的 OAuth 进行设计。当然,这个想法是移动应用程序将使用用户凭据授予类型向 OAuth 服务器进行身份验证,以获取令牌以进行进一步的工作流。另一方面,受保护的资源服务器将使用相同的 OAuth 服务器验证令牌信息并做出相应的响应。
一切都很清楚,但有一个问题:要让它工作,我们必须交付应用程序,其中包含在代码中编译的客户端密码。这打开了一个很大的安全漏洞。有没有办法避免它,或者它甚至是一个问题?
谢谢,
来自 RFC 6749, 4.3.2。访问令牌请求:
The authorization server MUST:
o require client authentication for confidential clients or for any
client that was issued client credentials (or with other
authentication requirements),
因此,如果您的客户端应用程序的客户端类型(RFC 6749, 2.1. Client Types)是公开的(并且您的客户端尚未获得客户端密码),则您不必在令牌请求中包含您的客户端密码。换句话说,您无需向授权服务器提供客户端密码即可获得访问令牌。在这种情况下,您可以避免将您的客户端密码嵌入到您的客户端应用程序中。
另一方面,如果您的客户端应用程序的客户端类型是机密的,则不应将客户端应用程序交付给智能手机。
如何将客户端类型设置为公开或机密取决于您使用的授权服务器的实现。一些实现提供了一个明确的切换按钮来选择公共或机密。其他人不提供这样的显式选项,并且您的客户端应用程序的客户端类型是隐式确定的。例如,如果您在授权服务器提供的配置页面中选择 Android Application,则客户端类型将变为 public。
但是请注意,某些授权服务器实现可能始终需要客户端机密,无论客户端类型是公开的还是机密的。