将Google API与OAuth2联系时的Redirect_uri_mismatch

Stu*_*art 6 google-api oauth-2.0 sencha-touch-2 cordova

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

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

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

我试过这两个都没有成功.

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

基本过程是:

  • 如上所述构建URL
  • 打开新的浏览器窗口(使用ChildBrowser PhoneGap插件)
  • 导航到URL
  • 此时Google登录页面显示并允许我输入凭据
  • 登录后点击我将进入包含上述错误的错误页面.

我在iPhone模拟器和我的iPhone上测试它,两者都有相同的结果.该应用程序不能在http:// localhost url上运行,而是在file:/// var/mobile/Applications/<guid>/<app name> /www/index.html上运行,但没有添加选项这在谷歌控制台(..或在那里?:))

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

提前致谢

斯图尔特

Ant*_*aco 8

我建议您将此视为使用OAuth2的Google API的最佳起点,在您的情况下,您需要这样:OAuth2 for Devices.

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

https://accounts.google.com/o/oauth2/device/code
Run Code Online (Sandbox Code Playgroud)

这是使用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"
Run Code Online (Sandbox Code Playgroud)

你会得到这样的答案:

{
  "device_code" : "4/AToZcyQ7U1BTV-xu4LAqpw02SgIW",
  "user_code" : "bqsj67hb",
  "verification_url" : "http://www.google.com/device",
  "expires_in" : 1800,
  "interval" : 5
}
Run Code Online (Sandbox Code Playgroud)

然后,您需要请求授权,向用户显示user_codeverification_url,以便将您的应用与用户的用户帐户"配对".这里有一个很好的例子,或者来自文档:

在您的应用程序向用户显示user_codeverification_url后,您的应用程序可能会开始使用user_codeverification_url返回的device_code轮询Google端点.要轮询的端点的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" 
Run Code Online (Sandbox Code Playgroud)

你会得到这样的回复:

{
  "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"
}
Run Code Online (Sandbox Code Playgroud)

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

curl https://www.googleapis.com/plus/v1/people/me?access_token=y23r9.AHES6ZT78qJl14pTueruthfh5676TYDF234-Eme33iQ
Run Code Online (Sandbox Code Playgroud)

关于的问题

"该应用程序不能在http:// localhost url上运行".

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

"urn:ietf:wg:oauth:2.0:oob"的情况下,并不完全是重定向.你需要"抓住"或"勾住"这个,只需继续你的过程,也许这可以帮助你或者这个.

祝好运!