我有一个Java应用程序需要让用户授权我的应用程序访问Google服务。我有以下一些代码来显示并获得我需要的授权:
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, JsonFactory, clientSecrets, scopes).build();
Credential cred = null;
try
{
LocalServerReceiver localSrv = new LocalServerReceiver();
AuthorizationCodeInstalledApp app = new AuthorizationCodeInstalledApp(flow, localSrv);
cred = app.authorize(userName);
}
catch(Exception ex)
{
ex.printStackTrace();
}
refreshToken = cred.getRefreshToken();
如果用户点击“授权”或“取消”按钮,一切都很好。但是,如果他们关闭浏览器窗口,则整个应用程序会冻结。有没有办法处理这种情况,以防止冻结或引入超时?
答案 0 :(得分:1)
我们还将Google云端硬盘整合到我们的应用程序中,这是我的一个问题。如果你调用authorize()
方法,那么调用的任何线程都会阻塞。您会注意到,当授权窗口打开时,应用程序也没有响应。
我希望有一种方法可以检测用户是否关闭了授权窗口,但似乎这只会导致LocalServerReceiver
无休止地等待永远不会到达的令牌。
此时您最好的选择是异步调用authorize()
,并等待回复。
编辑:我看了LocalServerReceiver
源代码,因为我们希望接收器重定向到不同的URL而不是显示纯文本。它实现了VerificationCodeReceiver
接口,该接口具有阻塞waitForCode()
方法。似乎AuthorizationCodeInstalledApp.authorize()
在等待时阻止,即使您自己实现VerificationCodeReceiver
。