我正在开发一个通过OAuth2和Spring保护的REST,它将从一个Android应用程序(客户机)中使用。为了访问我的API的任何端点,需要一个OAuth2访问令牌,并通过授权头以类似的方式传递给端点:
“授权”-“请到这里来”
为了获得访问令牌,必须提供用户名和密码,以及客户机ID和客户端机密(它们代表Android应用程序)。clientID和客户端秘密通过授权头以类似于此的方式传递给令牌端点,这是由Spring指定的:
“授权”--“基本客户:客户秘密”
如果客户端ID和客户端秘密匹配服务器上定义的客户端,如果用户存在且密码正确,则返回访问令牌和刷新令牌。
现在我的问题是如何安全地将我的clientId和客户端机密存储在安卓应用程序中,以确保那些逆转我的应用程序的工程师不能访问它们?
另外,如果我要开发一个iOS应用程序(第二个客户端),那么从安全POV中使用不同的clientID和客户端机密是否明智?
发布于 2017-06-14 13:03:37
你不能--即使有一种方法,我仍然可以检查线路上的有效载荷来确定值。见适用于本地应用程序的OAuth 2.0第8.5节
作为应用程序的一部分静态地包含给多个用户的秘密不应被视为机密,因为一个用户可以检查他们的副本并学习共享的秘密。因此,以及RFC6819第5.3.1节所述的原因,不建议授权服务器要求使用共享机密对公共本机应用程序客户端进行客户端身份验证,因为这除了客户端标识(即 已经由"client_id“请求参数提供。
您的客户id/机密参数只是提供发出请求的应用程序的标识,因此建议您为您的iOS应用程序创建不同的客户端,这两种方法都是从安全隔离的角度+为您希望收集的有关应用程序使用情况的分析(例如,“您通过客户端id检索了多少次尝试?”等)
然而,威胁参与者可以反向工程您的设置,获取您的客户端id +机密,然后开始使用用户名/密码组合访问您的令牌端点,试图强行使用您的应用程序。如果端点接受这些值并返回成功/失败代码,则对于试图危害您的系统的人来说,这是一个有用的攻击向量。
当前推荐的方法是使用“授权代码流”
当前授权本地应用程序中的用户的最佳做法是在外部用户代理(通常是浏览器)中执行OAuth授权请求,而不是嵌入式用户代理(比如使用web视图实现的用户代理)。 以前,对于OAuth授权请求,本机应用程序通常使用嵌入式用户代理(通常使用web视图实现)。这种方法有许多缺点,包括主机应用程序能够复制用户凭据和cookie,以及用户需要在每个应用程序中从头开始进行身份验证。有关为OAuth使用嵌入式用户代理的更深入分析,请参见8.12节。
有关更多信息,请访问安卓AppAuth,
https://stackoverflow.com/questions/44544825
复制相似问题