Java 使用Msal刷新令牌实现
我正在尝试将现有的acquire令牌实现从ADAL迁移到MSAL。 我能够获得访问令牌,并且grant\u type=auth\u代码流工作正常 但是,当我试图实现范围为脱机访问的grant_type=refresh_令牌时,问题就出现了,尽管我在调试代码时可以看到refresh_令牌,但由于MSAL没有向客户端公开refresh_令牌,所以我的响应中没有得到它 根据MSAL文档,我们应该在令牌过期后使用AcquireToken静默获取令牌 在这个链接中,它说 MSAL for Java有一个API,允许您将使用ADAL4j获取的刷新令牌迁移到ClientApplication:acquireToken(RefreshTokenParameters)中。使用此方法,可以提供以前使用的刷新令牌以及所需的任何作用域(资源)。刷新令牌将被交换为新令牌,并被缓存以供应用程序使用 因此,我对上面的一行感到困惑,因为MSAL不会公开refresh_令牌。我们如何创建RefreshTokenParameter 另外,我还有一个用例,在这个用例中,我确实需要将refresh\u令牌发送回客户端Java 使用Msal刷新令牌实现,java,adal,msal,refresh-token,Java,Adal,Msal,Refresh Token,我正在尝试将现有的acquire令牌实现从ADAL迁移到MSAL。 我能够获得访问令牌,并且grant\u type=auth\u代码流工作正常 但是,当我试图实现范围为脱机访问的grant_type=refresh_令牌时,问题就出现了,尽管我在调试代码时可以看到refresh_令牌,但由于MSAL没有向客户端公开refresh_令牌,所以我的响应中没有得到它 根据MSAL文档,我们应该在令牌过期后使用AcquireToken静默获取令牌 在这个链接中,它说 MSAL for Java有一个A
有谁能帮我提供进一步的指导吗。在MSAL包中,它提供了功能令牌缓存。它在获得令牌后缓存令牌。然后,我们可以尝试使用方法
acquireToken静默
从缓存中以静默方式刷新令牌
比如说
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));
PublicClientApplication pca=PublicClientApplication.builder(客户端ID)
.授权(授权)
.build();
消费者设备代码消费者=(设备代码设备代码)->
System.out.println(deviceCode.message());
//获取图的令牌
DeviceCodeFlowParameters参数=
DeviceCodeFlowParameters
.builder(Collections.singleton(“User.Read”),deviceCodeConsumer)
.build();
IAAuthenticationResult=pca.acquireToken(参数).join();
DecodedJWT jwt=jwt.decode(result.accessToken());
System.out.println(jwt.getAudience().get(0));
//刷新令牌
设置accountsInCache=pca.getAccounts().join();
IAccount account=accountsInCache.iterator().next();
//为我自己的api获取令牌
SilentParameters SilentParameters=
SilentParameters
.builder(集合.singleton(“api://872ebcec-c24a-4399-835a-201cdaf7d68b/access_as_user(会计)
.build();
结果=pca.acquireTokens(silentParameters.join();
jwt=jwt.decode(result.accessToken());
System.out.println(jwt.getAudience().get(0));
有关详细信息,请参阅
在包MSAL中,它提供了功能令牌缓存。它在获得令牌后缓存令牌。然后,我们可以尝试使用方法
acquireToken静默
从缓存中以静默方式刷新令牌
比如说
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));
PublicClientApplication pca=PublicClientApplication.builder(客户端ID)
.授权(授权)
.build();
消费者设备代码消费者=(设备代码设备代码)->
System.out.println(deviceCode.message());
//获取图的令牌
DeviceCodeFlowParameters参数=
DeviceCodeFlowParameters
.builder(Collections.singleton(“User.Read”),deviceCodeConsumer)
.build();
IAAuthenticationResult=pca.acquireToken(参数).join();
DecodedJWT jwt=jwt.decode(result.accessToken());
System.out.println(jwt.getAudience().get(0));
//刷新令牌
设置accountsInCache=pca.getAccounts().join();
IAccount account=accountsInCache.iterator().next();
//为我自己的api获取令牌
SilentParameters SilentParameters=
SilentParameters
.builder(集合.singleton(“api://872ebcec-c24a-4399-835a-201cdaf7d68b/access_as_user(会计)
.build();
结果=pca.acquireTokens(silentParameters.join();
jwt=jwt.decode(result.accessToken());
System.out.println(jwt.getAudience().get(0));
有关详细信息,请参阅
刷新令牌参数
是从ADAL而不是MSAL接收的刷新令牌创建的,文档是清晰的
MSAL for Java有一个API,允许您将使用ADAL4j获取的刷新令牌迁移到ClientApplication:acquireToken(刷新令牌参数)
然后在使用迁移代码之后,您将获得新的访问令牌和ID令牌,并且新的刷新令牌将存储在未公开的缓存中。因此,在您的情况下,如果您想要直接获得刷新令牌,您仍然需要使用ADAL
不确定您为什么需要这个,因为刷新令牌的作用是获取新的访问令牌/ID令牌,要实现这一点,您可以轻松地利用中的AcquireToken
。RefreshTokenParameter
是从ADAL而不是MSAL接收的刷新令牌创建的,文档是清晰的
MSAL for Java有一个API,允许您将使用ADAL4j获取的刷新令牌迁移到ClientApplication:acquireToken(刷新令牌参数)
然后在使用迁移代码之后,您将获得新的访问令牌和ID令牌,并且新的刷新令牌将存储在未公开的缓存中。因此,在您的情况下,如果您想要直接获得刷新令牌,您仍然需要使用ADAL
不确定您为什么需要这个,因为刷新令牌的作用是获取新的访问令牌/ID令牌,要实现这一点,您可以