我已经设置了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方法调用。该调用命中ListableMemoryCredentialStoreload(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/

10-12 06:02