【问题标题】:Redirect_uri_mismatch when contacting Google APIs with OAuth2使用 OAuth2 联系 Google API 时的 Redirect_uri_mismatch
【发布时间】:2012-04-23 14:50:10
【问题描述】:

我正在使用 Sencha Touch 和 PhoneGap 创建一个移动应用程序。我希望能够允许用户使用他们的 Google 凭据登录应用程序,但在初始请求时遇到了以下错误:

请求中的重定向 URI:http://localhost 与注册的 URI 不匹配。

我的 Google API 帐户注册了默认的 2 个 URI(http://localhost 和 urn:ietf:wg:oauth:2.0:oob)。

这两种方法我都试过了,都没有成功。

我发送的请求包含以下查询字符串参数:

基本流程是:

  • 如上构建网址
  • 打开新的浏览器窗口(使用 ChildBrowser PhoneGap 插件)
  • 导航到网址
  • 此时,Google 登录页面显示并允许我输入凭据
  • 点击登录后,我被带到一个包含上述错误的错误页面。

我正在 iPhone 模拟器和我的 iPhone 上对此进行测试,两者的结果相同。该应用程序似乎无法在 http://localhost url 上运行,而是在 file:///var/mobile/Applications///www/index.html 上运行,但没有选项可以将其添加到谷歌控制台(..或者在那里?:))

有人对为什么这不起作用有任何建议吗?我几乎没有使用 OAuth 和 Google 的 API 的经验,所以任何小提示都非常受欢迎!

提前致谢

斯图尔特

【问题讨论】:

    标签: cordova google-api oauth-2.0 sencha-touch-2


    【解决方案1】:

    我建议您阅读这篇文章作为Google API with OAuth2 的最佳起点,在您的情况下,您需要这个:OAuth2 for Devices

    可能您使用了错误的端点,要请求用户代码,您需要使用以下端点:

    https://accounts.google.com/o/oauth2/device/code
    

    这是一个使用 curl 的示例(在您的情况下授权访问 Google+ API):

    curl https://accounts.google.com/o/oauth2/device/code -d "client_id=**your_client_id**" -d "scope=https://www.googleapis.com/auth/plus.me" -d "redirect_uri=urn:ietf:wg:oauth:2.0:oob"
    

    你会得到这样的答案:

    {
      "device_code" : "4/AToZcyQ7U1BTV-xu4LAqpw02SgIW",
      "user_code" : "bqsj67hb",
      "verification_url" : "http://www.google.com/device",
      "expires_in" : 1800,
      "interval" : 5
    }
    

    然后您需要请求授权,向用户显示 user_codeverification_url 以将您的应用与用户的用户帐户“配对”。 Here there is a good example of this 或来自documentation

    在您的应用程序向用户显示 user_codeverification_url 后,您的应用程序可能会开始使用 device_code 轮询 Google 端点返回 user_codeverification_url。要轮询的端点的 URL 是https://accounts.google.com/o/oauth2/token,请求之间的时间间隔指定为以秒为单位的时间间隔。

    最后一步,使用 curl 请求 access_token:

    curl https://accounts.google.com/o/oauth2/token -d "client_id=**your_client_id**&client_secret=**your_client_secret**&code=**the _device_code_obtained_before**&grant_type=http://oauth.net/grant_type/device/1.0" 
    

    你会得到这样的回应:

    {
      "access_token" : "y23r9.AHES6ZT78qJl14pTueruthfh5676TYDF234-Eme33iQ",
      "token_type" : "Bearer",
      "expires_in" : 3600,
      "id_token" :  "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXVkIjoiNzgyMTM3OTUzMjkwLmFwcHMuZ29vZ2iLCJ0b2tlbl9oYXNoIjoiUUt0YmxTZUdsRUdNOVdPcUliRGR2QSIsImlhdCI6MTMzNDE3MDI1NywiZXhwIjoxMzM0MTc0MTU3fQ.Iz_Sv9X2fCydj4VfEdDxwWVH70DEK-rSzA5pWV9bvBdYB5VwgwFd8CSnotesDzJxq5pSKGwnAgvBfxSUbuGVmdET3E2sbrLODKymO9FoBzenfVooCwRXurzxvjKWF1EL3007lOPzTx9UGjqwShjjKQRoNjLFs-OmGCJsZGTHTGE",
      "refresh_token" : "1/gjgpKUyppp223s43HMerTX-zS_2JUxQOCk"
    }
    

    最后,您可以使用获得的 access_token 访问您已授予的服务(不要忘记从 API 控制台配置访问权限,在您的情况下是 Google+ API)。

    curl https://www.googleapis.com/plus/v1/people/me?access_token=y23r9.AHES6ZT78qJl14pTueruthfh5676TYDF234-Eme33iQ
    

    关于问题

    “应用程序似乎无法在 http://localhost url 上运行”。

    答案是是的,这是预期的行为。此 redirect_uri 告诉您在成功授予应用权限后回调的位置。在您的情况下是移动设备。

    对于 "urn:ietf:wg:oauth:2.0:oob",并不完全是重定向。您需要“抓住”或“钩住”它,以继续您的流程,可能是 this can help youthis

    祝你好运!

    【讨论】:

      【解决方案2】:

      我的回答与移动应用无关,但可能对其他人有所帮助。我有一个redirect_url_mismatch,我通过编辑Google Cloud Console 中的重定向url 解决了这个问题。 url 必须完全匹配,因此http://localhost:8080http://localhost:8080/ 不同。

      我可以通过在浏览器中打开this link 来测试它(替换您的client_id)。如果redirect_uri 错误,它会抱怨;如果正确或您已经授权访问,它将重定向到localhost:8080。另外,如果您已经授权访问,可以撤销here

      【讨论】:

      • 感谢您让我想到检查地址栏中的链接,这样更快地修复了
      【解决方案3】:

      我遇到了类似的问题,我执行了以下操作:在 API 控制台中将我的应用程序注册为 Web 应用程序,而不是已安装的应用程序。因此,我可以注册一个 http:// URL 作为重定向 uri。我在 Apache 服务器上的重定向 URL 的页面正文是:

      <? header("Location:myapp://authorize?code=".$_GET['code']); ?>
      

      这样,应用程序的行为实际上与其他 OAuth 授权服务相同,例如 facebook...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-12
        • 2021-06-22
        • 2014-07-01
        • 2018-09-06
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 2015-10-12
        相关资源
        最近更新 更多