refreshToken为null

时间:2013-06-27 02:44:27

标签: google-app-engine google-drive-api

我使用DREdit应用程序的Oauth代码为我的应用程序获取accessToken和refreshToken,并且我获得了accessToken但是refreshToken始终为null。

我尝试在代码中打印值,如下所示

authorization URL:https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=651991573332.apps.googleusercontent.com&redirect_uri=http://www.sakshum.org/GoogleOauth&response_type=code&scope=https://www.googleapis.com/auth/drive.file%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile

此代码已经有access_type = offline,我发现在某些情况下,url中没有这个原因。请告知此处还有什么不妥。

日志在appEngine

上打印如下
[s~sakshumweb-hrd/3.368699522239285323].<stdout>: Code:4/XQ1sR1Pu5VHDqGbG9iJO10bXVCCE.Qn-L1XwrBVYaEnp6UAPFm0EmSoCXfwI

W 2013-07-10 20:20:16.294
com.google.api.client.googleapis.services.AbstractGoogleClient <init>: Application name is not set. Call Builder#setApplicationName.
I 2013-07-10 20:20:16.536
[s~sakshumweb-hrd/3.368699522239285323].<stdout>: id:113470899999229420779

I 2013-07-10 20:20:17.936
[s~sakshumweb-hrd/3.368699522239285323].<stdout>: access token:ya29.AHES6ZSP7MXaaUhMz4RO7Jm3Zkh_s1zUxJyzW_6IvfADaQ

I 2013-07-10 20:20:17.936
[s~sakshumweb-hrd/3.368699522239285323].<stdout>: refresh token:null

2 个答案:

答案 0 :(得分:2)

刷新令牌仅在初始授权时发出(每当显示同意屏幕时)。如果您发现自己处于没有为用户保存刷新令牌的状态,您可以要求重新授权添加的查询参数提示=同意。将要求用户重新授权,并将生成新的刷新令牌。

答案 1 :(得分:0)

在您获得链接后,您将获得授权码。例如:

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

然后,如果将来你有权访问驱动器,你需要刷新令牌(你可以每次请求身份验证令牌 - 重定向到谷歌等等......但这不是好办法。首次使用后,你应该保存证书在具有用户UID的数据库中(例如,它可能是邮件)。因此,如果您需要访问该功能中的驱动器,请执行以下操作:

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);
    }
  }

我猜您也想获取Google云端硬盘中文件的网址。当您获得文件 - thee the documentation时,您会在com.google.api.services.drive.model.File对象中找到下载方法。阅读documentations