Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获得离线令牌和刷新令牌以及对Google API的自动刷新访问_Java_Google App Engine_Oauth 2.0_Google Api - Fatal编程技术网

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

Java 如何获得离线令牌和刷新令牌以及对Google API的自动刷新访问,java,google-app-engine,oauth-2.0,google-api,Java,Google App Engine,Oauth 2.0,Google Api,我正在开发一个应用程序,使用OAuth2和谷歌客户端库(在Appengine和GWT BTW上)访问谷歌API(从日历API开始) 我已经实现了我的OAuth2CallBackServlet,扩展了GoogleAbstractAppingineAuthorizationCodeCallBackServlet 我让它工作,我可以访问,可以查看日历等,但有两个问题: 1) 尽管明确请求脱机访问,但我没有获得刷新令牌: public static GoogleAuthorizationCodeFlow

我正在开发一个应用程序,使用OAuth2和谷歌客户端库(在Appengine和GWT BTW上)访问谷歌API(从日历API开始)

我已经实现了我的
OAuth2Call
BackServlet,扩展了Google
AbstractAppingineAuthorizationCodeCallBackServlet

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

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) 我看不出如何设置自动刷新功能。 这些页面描述了以下方法:

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

编辑 在进一步调试代码之后,当凭证返回时(在
onSuccess()
方法中),它似乎已经设置了
RefreshListener
。。因此,这可能是默认情况下它们的设置,我唯一的问题是,尽管请求,但我没有获得
refresh\u令牌


可能还需要查看Google API控制台中的设置?

有一件事需要注意:只有当用户明确同意请求的作用域时,才会返回刷新令牌(除了访问令牌之外)。基本上,当显示审批页面时。所有后续流将只返回一个访问令牌

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


更多信息也可以在开发者指南中找到。

我对此进行了研究,并得出结论,访问令牌只需要使用一次。也就是说,每个Google查询都有两个步骤:

  • 使用刷新令牌生成临时访问令牌
  • 将access_令牌用于操作所需的一个或多个查询
  • 我在这里看到了一些关于确保服务器时钟同步的帖子。但这似乎是不必要的复杂性

    有关更详细的说明:

    要获取刷新令牌,您必须同时设置
    accessType
    =“脱机”和
    approvalPrompt
    =“强制”


    谢谢你的评论,我将按照这些思路进行检查。目前,我对令牌进行了显式撤销,然后再次请求,我总是为用户通过显式接受屏幕-但仍然没有得到刷新令牌。vlatko,除了提示强制,我正在做你说的一切,这似乎已经解决了它!所以,非常感谢您的回答!这是一个bug,还是仅仅是文档(太广泛了…)中的一个明显遗漏?谢谢Sunny。但问题是,在第一次授权时,我得到的是AccessToken,而不是RefreshToken,尽管通过将AccessType设置为“offline”来请求它。如果你使用Google类(一旦你有一个RefreshToken),他们会存储它,并使用它在新的AccessToken过期时自动获取一个新的AccessToken,这对你来说是透明的。好的,谢谢你!.setApprovalPrompt(..)必须是一个相对较新的要求。大约一两个月前,我的代码在没有这个选项的情况下运行,它给了我刷新令牌。突然,它停止了工作,我不禁想知道为什么。
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT,
                JSON_FACTORY,
                CLIENT_ID,
                CLIENT_SECRET,  
                SCOPE)
    .setAccessType("offline")
    .setApprovalPrompt("force")
    .build();