java - MSAL4J 获取 refresh_token 和 access_token 来保存,而不是每次都请求用户许可
问题描述
我目前正在努力实现 MS Graph api 调用以访问来自 Microsoft 的一些信息。我对日历特别感兴趣。如果能够添加一些事件并删除它们或扫描这些事件,那就太好了。这个用例的 API 非常清晰,甚至有些直观。
我能够追溯我已经在代码中看到的我正在寻找的东西,但这并不是一个可行的解决方案。
https://github.com/AzureAD/microsoft-authentication-library-for-java/issues/228
微软员工亲切地告知他们在计划中没有这样的主流。我已经设法获得了这个授权代码并以编程方式调用了 api,但是每次令牌过期(大约一个小时)时,用户都用 MS Oauth 重新验证自己会很痛苦。我想这样一个科技巨头必须有一些对程序员友好的东西。
还有什么我可以使用的吗?
解决方案
如果使用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)。使用此方法,您可以提供以前使用的刷新令牌以及所需的任何范围(资源)。刷新令牌将交换为新令牌并缓存以供您的应用程序使用。
推荐阅读
- javascript - 检查特定日期的时间函数
- wordpress - Wordpress 固定链接规则更改不起作用
- javascript - 每隔几秒刷新一次外部网页
- html - CSS 将内容保持为纵向或方形模式
- jestjs - 开玩笑的异步测试 - expect.assertion 似乎是全球性的
- java - Java DateTime,ParseException 的无法到达的捕获块
- android - 在菜单项单击上使用适配器更改片段列表视图中的文本颜色
- qemu - 如何在 qemu 机器上使用持久存储
- php - 使用外键 laravel 从另一个表中获取数据
- wagtail - Wagtail 可以在其上运行的最旧受支持的 Django 版本是什么?