我已经设置了glass-java-starter项目,并在通知流程中遇到了一个问题,该问题由NotifyServlet处理。
我偶尔不能拿到“证书”。
以下是我遇到问题的地方。
Credential credential = AuthUtil.getCredential(userId);
在此行之后,即使我没有重新启动服务器,凭据也将为空
一旦发现错误,我可以通过重新登录网站来解决。
我不确定“凭据”存储是否有超时,如果是,请问它有多长时间以及如何处理超时,请问有什么做法可以遵循吗?
进一步更新:
一些发现:
我发现我们可以从凭证对象获取到期时间,如下所示
credential.getExpiresInSeconds()
获得证书后,我可以获得大约3600的返回值。因此,我认为通常访问令牌的到期时间为1小时。
当我遇到问题时,我相信它是在我登录后的几分钟,不会超过一小时。
另一点是,如果问题与凭证超时有关,那么我相信我仍然可以通过以下代码来获取凭证对象,即使存储在其中的令牌无效,凭证对象也应该存在。
凭证凭证= AuthUtil.getCredential(userId);
因此,我怀疑问题出在凭证对象存储中,我不确定当前应用程序如何存储凭证,但是即使它在内存中,只要不重新启动服务器,我都应该能够获得它。所以不知道乳清我在这里遇到“空”返回
最佳答案
我怀疑您的userId
值为空。因为将null
Credential
存储为特定的userId
后就不应该获取它。
详细原因:
如果AuthUtil.getCredential(userId)
不为null,并且有存储的Credential
用于传入的userId
,则Credential
返回userId
:
public static Credential getCredential(String userId) throws IOException {
if (userId == null) {
return null;
} else {
return AuthUtil.newAuthorizationCodeFlow().loadCredential(userId);
}
}
如果
userId
不为null,则调用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
的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();
}
}
因此,除非删除,否则不能删除存储的
Credential
或为null。应用程序重启或
传入的userId为null或
传入的
Credential
没有userId
。编辑:BTW到期时间不能使Credential NULL。尝试将accessToken,refreshToken和expireTime值写入文件或数据库,然后在CredentialStore中读取它们。如果再次遇到相同的问题,请检查传入的userId。
例如,我将它们存储在一张桌子上,却没有像您这样的问题。
关于java - glass-java-starter项目中的通知流中的凭据为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20837862/