将Google API与OAuth2联系时的Redirect_uri_mismatch

时间:2012-04-11 09:49:32

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

我正在使用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网址上运行,而是在文件:/// var / mobile / Applications /< guid> /< app name> /www/index.html上运行,但没有选项在谷歌控制台中添加这个(..或在那里?:))

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

提前致谢

斯图尔特

3 个答案:

答案 0 :(得分:8)

我建议您将此视为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_code verification_url ,以便将您的应用与用户的用户帐户“配对”。 Here there is a good example of this或来自documentation

  

在您的应用向用户显示 user_code verification_url 后,您的应用可能会开始使用 device_code 轮询Google端点使用 user_code verification_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"
}

最后,您可以访问已授予的服务(不要忘记通过API控制台配置访问权限,在您的情况下为Google+ API),并获取 access_token

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

关于

的问题
  

“该应用程序无法在http://localhost网址上运行”。

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

“urn:ietf:wg:oauth:2.0:oob”的情况下,并不完全是重定向。您需要“抓住”或“挂钩”这一点,只需继续您的流程,可能是this can help youthis

祝你好运!

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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

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