如何获取离线令牌和刷新令牌以及自动刷新对 Google API 的访问权限

我正在开发一个应用程序,该应用程序使用OAuth2和Google客户端库访问Google API(从Calendal API开始)(在Appengine和GWT BTW上)。

我已经实现了我的后台servlet,扩展了谷歌。OAuth2CallAbstractAppEngineAuthorizationCodeCallbackServlet

我有它的工作,我可以访问,可以查看日历等,但有两个问题:

1)我没有收到刷新令牌,尽管明确请求脱机访问:

public static GoogleAuthorizationCodeFlow newFlow( String scope ) throws IOException {
    GoogleAuthorizationCodeFlow.Builder builder = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, 
            JSON_FACTORY,
            getClientSecrets(), 
            Collections.singleton( scope ) );

    builder.setCredentialStore( new AppEngineCredentialStore() ).setAccessType("offline");

    return builder.build();
}

2)我无法看到如何设置自动刷新功能。这些页面描述了这些方法:

但是我看不到在哪里添加刷新侦听器。类中没有这样的方法,与类不同GoogleAuthorizationCodeFlow.BuilderCredential.Builder

编辑 在调试代码更多之后,当凭据返回(在方法中)时,它似乎已经有一个集合.....所以也许这是他们的默认,我唯一的问题是我没有得到一个,尽管要求它。onSuccess()RefreshListenerrefresh_token

也许还需要查看Google API控制台中的设置?


答案 1

应注意的一点是:仅当用户显式同意请求的作用域时,才会返回刷新令牌(除了访问令牌之外)。基本上,当显示审批页面时。所有后续流将仅返回访问令牌。

现在,为了测试应用程序并确保第一次收到刷新令牌,可以使用 approval_prompt=force 参数 () 来确保审批页显示在流中,并且你已获得用户的明确同意。解决任何问题并确保正确存储刷新令牌后,可以删除该标志(默认值为builder.setApprovalPrompt("force")auto)

开发人员指南的脱机访问部分还提供了详细信息。


答案 2

若要获取刷新令牌,必须同时设置 = “脱机”和 = “强制”。accessTypeapprovalPrompt

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT,
            JSON_FACTORY,
            CLIENT_ID,
            CLIENT_SECRET,  
            SCOPE)
.setAccessType("offline")
.setApprovalPrompt("force")
.build();

推荐