无法使用刷新令牌获取访问令牌

时间:2013-08-21 14:25:00

标签: oauth oauth-2.0 google-drive-api google-drive-realtime-api

我在java上编写了桌面应用程序,可以访问Google驱动器。 (它只是上传和下载文件)。

目前访问类型在线。当我需要访问文件/文件夹到驱动器时​​,我 将浏览器重定向到Google URL并获取访问代码:

String code = "code that was returned from brouser"
GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);

一切正常!但我只需要第一次进行重定向。

当我谷歌时,在Google Drive API documentation我发现我可以通过浏览器重定向获取刷新令牌并将其保存在数据库中。 (换句话说,我可以使用离线访问)。

每当我需要从谷歌驱动器读取数据时,我都会使用刷新令牌获取访问令牌,而无需重定向。不是吗?

所以我得到了那样的刷新令牌:

https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=695230079990.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/drive&response_type=code&redirect_uri=https://localhost

问题1
我从浏览器重定向中获取代码。它是刷新令牌,不是吗? 现在,我需要使用该刷新令牌获取访问令牌。

 $.ajax({
      type: "POST",
      url: 'https://accounts.google.com/o/oauth2/token',
      data: {
        client_id: "695230079990.apps.googleusercontent.com",
        client_secret: 'OWasYmp7YQ...4GJaPjP902R',
        refresh_toke: '4/hBr......................xwJCgQI',
        grant_type: 'refresh_token'
      },
      success: function(response) { 
        alert(response);
      }

    });

但我有错误400 ;

问题2)当我尝试更改重定向网址时出现错误:*

redirect_uri的参数值无效:不允许使用非公共域:https://sampl.ecom

所以,我必须创建Web应用程序客户端ID,而不是从谷歌API控制台安装应用程序吗?我不能在已安装的应用程序中更改重定向URI吗?我很困惑,我不知道,我应该使用哪个。

1 个答案:

答案 0 :(得分:0)

1)当您尝试进行离线访问时,您将获得可以兑换访问令牌和刷新令牌的授权码。

对于isntance:

https://accounts.google.com/o/oauth2/auth?access_type=offline
&approval_prompt=auto
&client_id=[your id]
&redirect_uri=[url]
&response_type=code
&scope=[access scopes]
&state=/profile

获得授权码后,您将获得刷新令牌。

 static Credential exchangeCode(String authorizationCode)
      throws CodeExchangeException {
    try {
      GoogleAuthorizationCodeFlow flow = getFlow();
      GoogleTokenResponse response =
          flow.newTokenRequest(authorizationCode).setRedirectUri(REDIRECT_URI).execute();
      return flow.createAndStoreCredential(response, null);
    } catch (IOException e) {
      System.err.println("An error occurred: " + e);
      throw new CodeExchangeException(null);
    }
  }

有关详细信息,请参阅有关Implementing Server-side Authorization令牌的部分。

在获得刷新令牌后,您必须保存它。有关mor信息,请参阅sample

2)如果您没有安装应用程序,则应创建Web应用程序以更改重定向URL。