代码之家  ›  专栏  ›  技术社区  ›  Greg Moens

是什么阻止了另一个应用程序窃取我的谷歌OAuth客户端ID?

  •  0
  • Greg Moens  · 技术社区  · 6 年前

    我创建了一个android应用程序,它使用appauth对google oauth进行身份验证。在谷歌云平台控制台中,我为我的应用程序创建了一个Android OAuth 2.0客户端ID,并提供了应用程序包名称和签名证书指纹。一切正常。

    我想验证只有我的应用程序才能使用该客户端ID。因此我创建了另一个具有不同包名称的应用程序,并用不同的签名证书对其进行了签名。使用相同的客户机ID,我仍然能够通过谷歌和访问API进行身份验证。我不认为是这样。我在查看AppAuth的源代码,它看起来不像在身份验证流期间使用过应用程序签名或包名称。当然,它使用pkce,但我希望会发生更多的事情。

    所以,如果我可以轻而易举地窃取我自己的客户机ID,那又是什么阻止其他人从我的APK中提取我的客户机ID并将其用于身份验证呢?我使用的用于重定向URI的自定义方案很容易根据包名来确定。因此,胭脂应用程序可以配置AppAuth使用类似的重定向URI并捕获授权结果。由于pkce只用于验证授权请求和代码交换来自同一个地方,所以一个胭脂应用程序会同时执行这两个操作,因此也没有真正的保护。

    我可以将客户机ID类型切换到Web或其他类型,但这需要我使用客户机机密,如果将其嵌入到应用程序中,这同样不安全。

    我是错过了什么,还是google oauth按预期工作?

    1 回复  |  直到 6 年前
        1
  •  0
  •   John Hanley    6 年前

    对于客户端google oauth 2,您的客户端ID并不重要。客户端执行OAuth流,客户端接收OAuth令牌。神奇的是,客户必须授权谷歌。任何人都可以窃取你的客户ID,但他们不能用它做任何事情。作为OAuth生命周期的一部分,您应该验证OAuth令牌。你的后台不应该盲目地接受客户的任何东西——或者任何不受你绝对控制的地方。

    你的客户ID不是秘密,你可以把它写在你的代码里。

    客户的秘密必须保密。 客户端身份验证不涉及客户端机密。客户端机密用于后端服务器。

    我认为你混淆了这个过程。当客户端应用程序(你的应用程序、网页浏览器等)通过谷歌帐户验证时,你的应用程序将不会被授权。正在授权客户。客户应该对他们访问的网站(或应用程序)有很好的判断,并使用他们的Google登录。客户端唯一能做的就是访问自己的数据(谷歌驱动器、Gmail等)。如果后端服务器正在接受客户端的OAuth令牌来管理访问,那么您将负责验证该令牌及其在系统上的所需用法以及该令牌的授权来源。

    更好的选择是在后端(例如Web服务器)上执行身份验证和授权。然后,您可以实现GoogleOAuth重定向,将OAuth令牌发送到您的服务器。您受到的保护只有授权的来源(例如您的域名)和授权的重定向URI(Web服务器上的端点)才能参与验证过程。然后将令牌存储在客户机会话中,必要时进行续订,根据需要添加授权范围等。

    我经常使用这两种方法(客户机端、服务器端),而且都很好地工作。