【问题标题】:401 Unauthorized when authenticating with Google for hybrid applications向 Google 验证混合应用程序时出现 401 Unauthorized
【发布时间】:2015-05-19 10:57:27
【问题描述】:

我想使用本机应用程序和网络服务器来获取刷新令牌以用于某些操作(在谷歌驱动器上)。已使用 Google developer console 为本机和 Web 应用程序生成客户端 ID 和机密。

我正在尝试从本机应用程序生成身份验证码,并使用深受 java example 启发的脚本从 Web 服务器交换它们以获取访问/刷新令牌。主要区别在于有两个 GoogleAuthorizationCodeFlow(它们代表本机和服务器部分):

  • 使用本机应用程序的 id 和 secret 并用于生成授权码。
  • 一种使用 Web 应用程序 ID 和密钥并用于将授权代码交换为凭据。

但是,这样的过程确实会导致 401 Unauthorized 异常。

当对两个 GoogleAuthorizationCodeFlows 使用相同的凭据时,无论是本机应用程序的凭据还是 Web 应用程序的凭据,该过程都会成功并返回一个刷新令牌。

如何在 Web 应用程序上使用本机应用程序的授权代码来生成访问令牌?有没有办法使用 Web 应用程序 ID 和密码来交换授权代码,或者必须使用用于生成令牌的相同凭据来完成程序?

【问题讨论】:

    标签: google-api google-oauth


    【解决方案1】:

    它不起作用的原因是身份验证与客户端 ID 和客户端密码相关联。

    当用户进行身份验证时,他们正在验证该客户端 ID/客户端密钥对。您不能只获取刷新令牌或身份验证代码并将其与不同的客户端 ID 和密码一起使用,它们不会匹配,它不会工作,您将获得 401 Unauthorized exception

    你在正确的轨道上

    如何使用来自本机应用程序的授权代码 Web 应用程序来生成访问令牌?

    您需要做的就是只创建一个Client ID for native application 并为您的本地应用程序和您的Web 应用程序使用客户端ID 和客户端密码。

    网页与原生

    Client ID for native applicationClient ID for web application 之间唯一真正的区别是重定向 URI。重定向 URI 只是告诉身份验证服务器将身份验证返回到哪里。对于一个很简单的网站,您在大多数情况下处理代码的网页是相同的 IP 地址。在本机应用程序的情况下,无法知道这一点,因此服务器将信息发送回请求 IP。除此之外,实际上并没有什么区别,只是谷歌可能想知道它是一个网站还是运行代码的已安装应用程序。因此,您可以在 Web 应用程序上使用本机客户端 ID,服务器只会将其返回到它所要求的位置。

    安全

    在 Web 应用程序上使用本机程序可能有一些安全考虑,我想有人可能会掌握它并使用您的客户端 ID 发送信息。 TBH 我发现这个机会有限。

    【讨论】:

    • 在不共享相同密钥的应用程序之间单点登录是不可能的吗?开发人员控制台的结构方式当然表明您可以创建相关的应用程序,因为它们位于同一个项目中。看起来您只需要创建一个应用程序 clientid 和密码,并且您需要信任您与之交互的每个应用程序,而这几乎从来都不是这种情况。那么为什么要在一个项目中创建多个 clientId 和 secret 呢?
    • 他的页面怎么样,这表明您可以使用带有 Web 后端的 android 客户端,两者都有自己的 clientId? developers.google.com/identity/protocols/CrossClientAuth
    • 其中一些似乎是由 android 库处理的。 (网络客户端、JavaScript 客户端和 Android 应用程序)我的方式会奏效,而且可能更容易。
    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 2014-12-02
    • 2017-04-23
    • 2015-10-04
    相关资源
    最近更新 更多