0

我在 Java Spring Boot 应用程序中使用msal4j库进行身份和令牌管理来访问 Microsoft Graph API。

我在这里关注示例代码。

在代码中,TokenCache由 accessTokens、refreshTokens、idTokens 组成的对象存储在 http 会话中。

SessionManagementHelper.storeTokenCacheInSession(httpServletRequest, app.tokenCache().serialize());

static void storeTokenCacheInSession(HttpServletRequest httpServletRequest, String tokenCache){
    httpServletRequest.getSession().setAttribute('token_cache', tokenCache);
}  

现在,如果我的 Spring Boot 应用程序崩溃等,令牌将会丢失。而且我将不得不再次进行帐户选择过程,我想避免这种情况,因为用户已经选择了帐户并表示同意。

如果我的应用程序重新启动,如何避免再次执行帐户选择过程?我需要将令牌缓存存储在数据库中吗?

我的授权 URL 如下所示:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
response_type=code&
redirect_uri=https%3A%2F%2Flocalhost%3A8443%2Fmsal4jsample%2Fsecure%2Faad&
client_id=ca146462-8880-424c-b629-cc7c0d0fb1b3&
scope=openid+offline_access+profile+https%3A%2F%2Fgraph.microsoft.com%2Fuser.read&
prompt=select_account&
state=69a2ac0f-abac-46ad-b525-88f0b70182b7&
nonce=9278f424-6858-4e22-bb13-7b13894abda7
4

1 回答 1

1

我希望您所采取的应用程序崩溃场景是在托管之前。当应用程序崩溃时,浏览器和应用程序之间的连接会断开。当应用程序再次重新启动时,会建立新的连接,并且需要再次进行帐户选择过程。

关于 Token Cache 存储,客户在使用 redis 和本文档中所述的其他分布式缓存存储时报告了良好的结果

出于安全和性能原因,我们的建议是为每个用户序列化一个缓存。序列化事件根据已处理用户的身份计算缓存键,并为该用户序列化/反序列化令牌缓存。

以下是一些关于令牌缓存的文档,您可以参考这些文档。所有文档都讨论了在服务器端存储(缓存)令牌,这些文档还包含指向GitHub 示例的链接以供编码参考。

其他文档供参考。

于 2020-05-14T20:36:33.323 回答