使用 Msal 刷新令牌实现

问题描述

我正在尝试将我现有的获取令牌实现从 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));

enter image description here

详情请参考

https://docs.microsoft.com/en-us/azure/active-directory/develop/migrate-adal-msal-java#core-classes

https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-acquire-cache-tokens#acquiring-tokens-silently-from-the-cache

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。>