Java 使用Msal刷新令牌实现

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

我正在尝试将现有的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令牌发送回客户端


有谁能帮我提供进一步的指导吗。

在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令牌,要实现这一点,您可以