使用 Msal 刷新令牌实现

Refresh token implementation using Msal

我正在尝试将我现有的获取令牌实现从 ADAL 迁移到 MSAL。 我能够获得访问令牌并且 grant_type=auth_code 流程工作正常。

但是当我尝试实现范围为 offline_access 的 grant_type=refresh_token 时,问题就来了,尽管我在调试时能够看到 refresh_token代码,但由于 MSAL 不会将 refresh_token 公开给客户端,因此我没有将其作为响应的一部分。

根据 MSAL 文档,它说我们应该在令牌过期后使用 acquireTokenSilently 来获取令牌。

在这个linkADAL to MSAL Migration里面说

MSAL for Java has an API that allows you to migrate refresh tokens you acquired with ADAL4j into the ClientApplication: acquireToken(RefreshTokenParameters). With this method, you can provide the previously used refresh token along with any scopes (resources) you desire. The refresh token will be exchanged for a new one and cached for use by your application.

所以我对上面的行感到困惑,因为 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://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 has an API that allows you to migrate refresh tokens you acquired with ADAL4j into the ClientApplication: acquireToken(RefreshTokenParameters).

然后使用迁移代码here后,你会得到新的access token和ID token,新的refresh token会存放在不暴露的缓存中。所以你的情况,如果想直接获取refresh token,还是需要用到ADAL。

不确定为什么需要这个,因为刷新令牌的作用是获取新的访问token/ID令牌,为此,您可以利用MSAL中的acquireTokenSilently很容易。