问题描述
我正在尝试将我现有的获取令牌实现从 ADAL 迁移到 MSAL。 我能够获得访问令牌,并且 grant_type=auth_code 流程工作正常。
但是当我尝试实现范围为offline_access的grant_type=refresh_token时出现问题,即使我在调试代码时能够看到refresh_token,但由于MSAL没有将refresh_token暴露给客户端,我不明白我的部分回复。
根据 MSAL 文档,它说我们应该在令牌过期后使用acquiretokenSilently 来获取令牌。
在这个链接中ADAL to MSAL Migration它说
MSAL for Java 有一个 API,允许您将使用 adal4j 获取的刷新令牌迁移到 ClientApplication:acquiretoken(RefreshTokenParameters)。使用此方法,您可以提供以前使用的刷新令牌以及您想要的任何范围(资源)。刷新令牌将交换为新令牌并缓存以供您的应用程序使用。
所以我对上面的行感到困惑,因为 MSAL 不会公开 refresh_token 我们如何创建 RefreshTokenParameter。
我还有一个用例,我确实需要将 refresh_token 发送回客户端。
任何人都可以通过提供进一步的指导来帮助我。
解决方法
在包 MSAL 中,它提供了功能令牌缓存。它在获取令牌后缓存令牌。然后我们可以尝试使用 acquireTokenSilently
方法从缓存中静默刷新令牌。
例如
PublicClientApplication pca = PublicClientApplication.builder(CLIENT_ID)
.authority(AUTHORITY)
.build();
Consumer<DeviceCode> deviceCodeConsumer = (DeviceCode deviceCode) ->
System.out.println(deviceCode.message());
// get token for graph
DeviceCodeFlowParameters parameters =
DeviceCodeFlowParameters
.builder(Collections.singleton("User.Read"),deviceCodeConsumer)
.build();
IAuthenticationResult result = pca.acquireToken(parameters).join();
DecodedJWT jwt = JWT.decode(result.accessToken());
System.out.println(jwt.getAudience().get(0));
// refresh token
Set<IAccount> accountsInCache = pca.getAccounts().join();
IAccount account = accountsInCache.iterator().next();
// get token for my own api
SilentParameters silentParameters =
SilentParameters
.builder(Collections.singleton("api://872ebcec-c24a-4399-835a-201cdaf7d68b/access_as_user"),account)
.build();
result = pca.acquireTokenSilently(silentParameters).join();
jwt = JWT.decode(result.accessToken());
System.out.println(jwt.getAudience().get(0));
详情请参考
https://docs.microsoft.com/en-us/azure/active-directory/develop/migrate-adal-msal-java#core-classes
https://github.com/Azure-Samples/ms-identity-java-devicecodeflow
,RefreshTokenParameter
是根据从 ADAL 接收的刷新令牌创建的,而不是 MSAL,文档很清楚。
MSAL for Java 有一个 API,允许您将使用 ADAL4j 获取的刷新令牌迁移到 ClientApplication:acquireToken(RefreshTokenParameters)。
然后使用迁移码here后,会得到新的access token和ID token,新的refresh token会保存在不暴露的缓存中。所以在你的情况下,如果你想直接获取刷新令牌,你仍然需要使用 ADAL。
不确定您为什么需要这个,因为刷新令牌的作用是获取新的访问令牌/ID 令牌,为此,您可以轻松利用 MSAL 中的 acquireTokenSilently
。>