Google API OAuth2 - 从授权令牌

时间:2016-06-12 14:13:44

标签: oauth google-api authorization google-oauth google-oauth2

按照Using OAuth 2.0 for Installed Applications中描述的步骤,我已经能够获得我的应用程序的授权代码。

我已在Google Developers Console中将我的应用程序注册为OAuth 2.0客户端ID: http://image.prntscr.com/image/bcda26f2ee12463e80e4fdd9401380da.png

我使用的是“其他”类型,因为应用程序只需要获取一个新的access_token(使用refresh_token),并且不会使用任何类型的用户同意。

安全性并不重要,因为它将是一个私人应用程序。

应用程序需要能够读取和写入电子表格,并运行链接到电子表格的Google Apps脚本。

根据https://www.googleapis.com/auth/spreadsheets,这可以在“Google's OAuth 2.0 Playground”范围内完成:

http://image.prntscr.com/image/a506d2095be1472aa1807a52b01ab1f1.png

我已经能够使用以下请求(this步骤之后)获取授权代码:

https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
response_type=code&
client_id=#####.apps.googleusercontent.com

在我的浏览器中粘贴此网址后,它会将我重定向到此页面:

http://image.prntscr.com/image/64ccfc9a63be4cb985163c0e3ba0c8ef.png

这样我获得了一个授权代码,从理论上讲,它可以替换为refresh_token和access_token。

我尝试模仿Google的OAuth 2.0 Playground在交换refresh_token和access_token的授权代码时所做的请求:

http://image.prntscr.com/image/54e7e7da18f044c3a86e2a05b51ba830.png

它向以下URL发送POST请求:

https://www.googleapis.com/oauth2/v3/token?
  code={auth_code}&
  redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&
  client_id=#####.apps.googleusercontent.com&
  client_secret=#####&
  scope=&
  grant_type=authorization_code

当我尝试执行此请求时,我得到一个ERROR 400,其响应如下:

 {"error": "invalid_request", "error_description": "Invalid parameter value for redirect_uri: Missing scheme: {redirect_uri}}

它为redirect_uri引发了一个关于“Missing scheme”的错误。我认为这并不奇怪,因为我的应用类型是“其他”,而您无法使用该类型授权重定向URI

我已经尝试了OAuth2ForDevices 完全 我想要的),但我无法将其用于Google的电子表格。

使用通过客户端ID类型“其他”(可用于Google电子表格)获取的授权代码获取refresh_token(和access_token)的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

我明白了。

使用此请求:

https://accounts.google.com/o/oauth2/v2/auth?
  scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets&
  redirect_uri=urn:ietf:wg:oauth:2.0:oob&
  response_type=code&
  client_id=#####.apps.googleusercontent.com

这将返回授权码。 然后,发出以下POST请求:

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code={auth_code}&
client_id=######.apps.googleusercontent.com&
client_secret=#####&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
grant_type=authorization_code

如果你不使用" urn:ietf:wg:oauth:2.0:oob"作为你的redirect_uri,它不起作用。 OAuth2InstalledApp Guide中没有说明这一点(它使用" https://oauth2-login-demo.appspot.com/code"作为redirect_uri的示例,这让我很困惑。)

简短回答:使用" urn:ietf:wg:oauth:2.0:oob" as redirect_uri

答案 1 :(得分:0)

使用您用于呼叫的相同redirect_uri:

  

https://accounts.google.com/o/oauth2/v2/auth

Google不会向该uri提出任何进一步的请求,但我认为它将其用于匹配目的,作为一些小的附加安全性。