首页 > 解决方案 > MSAL4J 获取 refresh_token 和 access_token 来保存,而不是每次都请求用户许可

问题描述

我目前正在努力实现 MS Graph api 调用以访问来自 Microsoft 的一些信息。我对日历特别感兴趣。如果能够添加一些事件并删除它们或扫描这些事件,那就太好了。这个用例的 API 非常清晰,甚至有些直观。

我能够追溯我已经在代码中看到的我正在寻找的东西,但这并不是一个可行的解决方案。

https://github.com/AzureAD/microsoft-authentication-library-for-java/issues/228

微软员工亲切地告知他们在计划中没有这样的主流。我已经设法获得了这个授权代码并以编程方式调用了 api,但是每次令牌过期(大约一个小时)时,用户都用 MS Oauth 重新验证自己会很痛苦。我想这样一个科技巨头必须有一些对程序员友好的东西。

还有什么我可以使用的吗?

标签: javamicrosoft-graph-apimsalmicrosoft-graph-sdks

解决方案


如果使用MSAL获取令牌,则刷新令牌将存储在未公开的缓存中。我们可以使用 获取新的访问令牌,请参见此处acquireTokenSilently的代码。

    SilentParameters parameters = SilentParameters.builder(
            Collections.singleton("User.ReadBasic.All"),
            result.account()).build();

    CompletableFuture<IAuthenticationResult> future = app.acquireTokenSilently(parameters);
    IAuthenticationResult updatedResult = future.get();

如果您想直接获取刷新令牌,如文档所示,MSAL 不支持它,而 ADAL4J 可以。

在 ADAL4J 中,刷新令牌是公开的——这允许开发人员缓存它们。然后,它们将AcquireTokenByRefreshToken()用于启用解决方案,例如实施长时间运行的服务,在用户不再连接时代表用户刷新仪表板。

出于安全原因,适用于 Java 的 MSAL 不会公开刷新令牌。相反,MSAL 会为您处理刷新令牌。

MSAL for Java 有一个 API,允许您将使用 ADAL4j 获取的刷新令牌迁移到 ClientApplication: acquireToken(RefreshTokenParameters)。使用此方法,您可以提供以前使用的刷新令牌以及所需的任何范围(资源)。刷新令牌将交换为新令牌并缓存以供您的应用程序使用。


推荐阅读