我正在开发一个通过OAuth2和 Spring保护的 REST API ,它将在 Android 应用程序(客户端)中使用。为了访问我的 API 的任何端点,需要一个 OAuth2 访问令牌并通过授权标头以类似于以下的方式移交给端点:
“授权”-“Bearer accesstokenhere”
为了获取访问令牌,必须提供用户名和密码,以及客户端 ID 和客户端密码(它们代表 Android 应用程序)。clientID 和 client secret 通过 Authorization Header 以类似的方式交给 token 端点,由 Spring 指定:
“授权”-“基本clientId:clientSecret”
如果客户端 ID 和客户端密钥与服务器上定义的客户端匹配,并且用户存在且密码正确,则返回访问令牌和刷新令牌。
现在我的问题是如何在 Android 应用程序中安全地存储我的 clientId 和客户端机密,确保对我的应用程序进行逆向工程的人无法访问它们?
另外,如果我要开发一个 iOS 应用程序(第二个客户端),从安全 POV 使用不同的客户端 ID 和客户端密码是否明智?
你不能 - 即使有办法,我仍然可以检查线路上的有效载荷来确定值。请参阅本机应用程序的OAuth 2.0 的第 8.5 节
作为分发给多个用户的应用程序的一部分静态包含的机密不应被视为机密机密,因为一个用户可能会检查其副本并了解共享机密。出于这个原因,以及 [RFC6819] 的第 5.3.1 节中所述的那些,不建议授权服务器要求使用共享密钥对公共本机应用程序客户端进行客户端身份验证,因为除了
已经提供的客户端识别之外,这几乎没有任何价值通过“client_id”请求参数。
您的客户端 id/secret 参数仅提供发出请求的应用程序的身份,因此建议您为 iOS 应用程序创建不同的客户端,无论是从安全隔离的角度还是您想要的任何分析收集有关您的应用程序的使用情况(例如,“您通过客户端 ID 检索了多少次登录尝试?”等)
但是,威胁行为者可以对您的设置进行逆向工程,获取您的客户端 ID + 机密,然后开始使用用户名/密码组合攻击您的令牌端点,以尝试对您的应用程序进行暴力破解。如果端点接受这些值并返回成功/失败代码,这对于试图破坏您的系统的人来说是一个有用的攻击向量。
当前推荐的方法是使用“授权代码流”
当前在本机应用程序中授权用户的最佳做法是在外部用户代理(通常是浏览器)中执行 OAuth 授权请求,而不是嵌入式用户代理(例如使用 Web 视图实现的用户代理)。
以前,本机应用程序对 OAuth 授权请求使用嵌入式用户代理(通常通过 Web 视图实现)是很常见的。这种方法有很多缺点,包括宿主应用程序能够复制用户凭据和 cookie,以及用户需要在每个应用程序中从头开始进行身份验证。有关使用嵌入式用户代理进行 OAuth 的更深入分析,请参阅第 8.12 节。”
看看AppAuth for Android了解更多信息,
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句