glass-java-starter项目中的通知流中的凭据为空

时间:2013-12-30 10:40:19

标签: java google-glass google-mirror-api

我已经设置了glass-java-starter项目并在通知流程中遇到问题,该问题由NotifyServlet处理。

偶尔我无法获得“凭证”。

以下是我遇到问题的地方。

Credential credential = AuthUtil.getCredential(userId);
偶尔即使我没有重启服务器

凭证也会在此行之后为空

一旦出现错误,我可以通过重新登录网站解决问题。

我不确定“凭证”商店是否有超时,如果是,有多长时间,以及如何处理超时,是否需要遵循任何做法?

进一步更新:

一些发现:

  • 我发现我们可以从Credential对象获取到期时间,如下所示

    credential.getExpiresInSeconds()

在获得凭证后,我可以获得大约3600的返回值。所以我认为通常访问令牌的到期时间是1小时。

当我遇到问题时,我相信我登录后只需几分钟,不会超过一小时。

  • 另一点是,如果问题是关于凭据超时,那么我相信我仍然可以通过以下代码获取凭证对象,即使存储在其中的令牌无效,凭证对象也应该在那里。

    凭据凭证= AuthUtil.getCredential(userId);

所以我怀疑问题是在凭证对象存储中,我不确定当前的应用程序如何存储凭证,但即使它在内存中,我想我应该能够得到它,只要我不重启服务器。所以不知道乳清我遇到了“Null”回归

1 个答案:

答案 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
  1. 应用程序重新启动或
  2. 传入的userId为null或
  3. 传入Credential没有Credential
  4. 编辑: BTW过期时间无法使凭据为空。尝试将accessToken,refreshToken和expireTime值写入文件或数据库,并在CredentialStore中读取它们。如果您再次遇到同样的问题,请检查您的传入userId。

    例如,我将它们存放在一张桌子上,从来没有像你那样出现问题。