我已经设置了glass-java-starter项目并在通知流程中遇到问题,该问题由NotifyServlet处理。
偶尔我无法获得“凭证”。
以下是我遇到问题的地方。
Credential credential = AuthUtil.getCredential(userId);
偶尔即使我没有重启服务器,凭证也会在此行之后为空
一旦出现错误,我可以通过重新登录网站解决问题。
我不确定“凭证”商店是否有超时,如果是,有多长时间,以及如何处理超时,是否需要遵循任何做法?
我发现我们可以从Credential对象获取到期时间,如下所示
credential.getExpiresInSeconds()
在获得凭证后,我可以获得大约3600的返回值。所以我认为通常访问令牌的到期时间是1小时。
当我遇到问题时,我相信我登录后只需几分钟,不会超过一小时。
另一点是,如果问题是关于凭据超时,那么我相信我仍然可以通过以下代码获取凭证对象,即使存储在其中的令牌无效,凭证对象也应该在那里。
凭据凭证= AuthUtil.getCredential(userId);
所以我怀疑问题是在凭证对象存储中,我不确定当前的应用程序如何存储凭证,但即使它在内存中,我想我应该能够得到它,只要我不重启服务器。所以不知道乳清我遇到了“Null”回归
答案 0 :(得分:0)
我怀疑您的userId
值为空。因为在为特定null
存储后,您不应该Credential
userId
。
详细原因:
如果AuthUtil.getCredential(userId)
非空, Credential
会返回userId
,并且传入的Credential
存储userId
:< / p>
public static Credential getCredential(String userId) throws IOException {
if (userId == null) {
return null;
} else {
return AuthUtil.newAuthorizationCodeFlow().loadCredential(userId);
}
}
如果userId
不为空,则调用newAuthorizationCodeFlow
并创建GoogleAuthorizationCodeFlow
实例:
public static AuthorizationCodeFlow newAuthorizationCodeFlow() throws IOException {
// we have clientId and clientSecret here
GoogleAuthorizationCodeFlow authCodeFlow = GoogleAuthorizationCodeFlow.Builder(new NetHttpTransport(), new JacksonFactory(), clientId, clientSecret, Collections.singleton(GLASS_SCOPE)).setAccessType("offline");
authCodeFlow.setCredentialStore(store).build();
return authCodeFlow ;
}
我们在store
中使用的 newAuthorizationCodeFlow
实例是一个静态对象,我们将所有Credential
存储在该静态对象中:
public static ListableMemoryCredentialStore store = new ListableMemoryCredentialStore();
如果我们再次返回getCredential
方法,您会看到loadCredential
方法调用。此调用会点击ListableMemoryCredentialStore
的{{1}}方法:
load(String userId, Credential credential)
因此,除非;
,否则无法删除存储的public boolean load(String userId, Credential credential) {
lock.lock();
try {
MemoryPersistedCredential item = store.get(userId);
if (item != null) {
item.load(credential);
}
return item != null;
} finally {
lock.unlock();
}
}
或null
Credential
没有Credential
。编辑: BTW过期时间无法使凭据为空。尝试将accessToken,refreshToken和expireTime值写入文件或数据库,并在CredentialStore中读取它们。如果您再次遇到同样的问题,请检查您的传入userId。
例如,我将它们存放在一张桌子上,从来没有像你那样出现问题。