当Android应用程序获得Web后端的离线访问时,如何处理redirect_uri_mismatch错误?

时间:2015-05-12 15:00:27

标签: android oauth-2.0 google-oauth

我想实现这个问题中描述的流程:

Authenticating with OAuth2 for an app *and* a website

此处描述了针对此要求的Google解决方案:

https://developers.google.com/identity/protocols/CrossClientAuth#offlineAccess

我遵循了本指南但不幸的是,当我在后端使用授权代码来访问令牌并从google刷新令牌时,谷歌会抛出此错误:

{
  "error": "invalid_request",
  "error_description": "Missing parameter: redirect_uri"
}

redirect_uri对于这种情况没有意义,因为客户端是android。

还有一些建议,他们说使用“postmessage”作为重定向uri或使用http://localhost作为重定向uri或在谷歌应用控制台中的重定向URI中添加服务器地址,但没有一个适用于此流程。

3 个答案:

答案 0 :(得分:1)

我花了很多时间来解决这个问题,这个工具(https://developers.google.com/oauthplayground)已经由谷歌提供让我更加想念铅因为它是专为主要的网络流而设计的,并且这个工具生成的访问令牌是不同的需要重定向uri。 (即使使用承载令牌类型并使用客户端ID和秘密) 毕竟我用空字符串(“”)作为重定向网址,最后我成功通过服务器端获取访问令牌。

答案 1 :(得分:1)

空白应该可以使用,或者您也可以使用已安装的应用重定向URI:' urn:ietf:wg:oauth:2.0:oob' - 见https://developers.google.com/identity/protocols/OAuth2InstalledApp

答案 2 :(得分:1)

在深入调查AppAuth库(https://openid.github.io/AppAuth-iOS/https://openid.github.io/AppAuth-Android/之前花了两天时间研究了stackoverflow和google上的几乎所有问题,最后找到了答案。

所以,我发现了两条规则:

  1. redirect_uri应该是以下之一:

    • 您的应用bundle_idpackage_name + :/:// + *your_path*(例如com.example.myapp://google_auth
    • 您的client_id反向DNS表单+ :/:// + *your_path*(例如com.googleusercontent.apps.*account_id*:/my_path
  2. 初始授权代码请求(redirect_uri)和授权代码交换请求(https://accounts.google.com/o/oauth2/v2/auth)中的
  3. https://www.googleapis.com/oauth2/v4/token必须完全相同