当前位置: 首页 > 知识库问答 >
问题:

使用Msa刷新令牌实现

乐正镜
2023-03-14

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

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

根据MSAL留档,它说一旦令牌过期,我们应该使用获取令牌。

在将ADAL与MSAL迁移联系起来时,它说:

Java MSAL有一个API,允许您将使用ADAL4j获得的刷新令牌迁移到client application:acquire token(refresh token parameters)。使用这种方法,您可以提供以前使用的刷新令牌以及您想要的任何作用域(资源)。刷新令牌将被替换为新的令牌,并被缓存以供您的应用程序使用。

所以我对上面的行感到困惑,因为MSAL不会公开refresh_token我们如何创建刷新令牌参数。

我还有一个用例,需要将refresh_token发送回客户端。

有人能帮我提供进一步的指导吗?

共有2个答案

沃瑾瑜
2023-03-14

在包MSAL中,它提供了功能令牌缓存。它在获得令牌后缓存令牌。然后,我们可以尝试使用方法AcquireTokenSilent从缓存中静默刷新令牌。

比如说

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

澹台胜
2023-03-14

刷新令牌参数是从从 ADAL(而不是 MSAL)接收的刷新令牌创建的,文档很清楚。

MSAL forJava有一个API,允许您将使用ADAL4j获取的刷新令牌迁移到ClientApplication: quireToken(RelistTokenParameters)。

然后在这里使用了迁移代码之后,你会得到新的访问令牌和ID令牌,新的刷新令牌会存储在不公开的缓存中。因此,在您的情况下,如果您想直接获得刷新令牌,您仍然需要使用ADAL。

不确定为什么需要这样做,因为刷新令牌的作用是获取新的访问令牌/ID令牌,要实现这一点,您可以轻松地利用MSAL中的acquireTokensilent

 类似资料:
  • 请求你分享你的想法。 提前道谢。

  • 我正在使用Cognito用户池对系统中的用户进行身份验证。成功的身份验证将提供一个ID令牌(JWT)、一个访问令牌(JWT)和一个刷新令牌。这里的文档清楚地提到了刷新令牌可以用于刷新访问令牌,但没有提到如何使用。我的问题是,一旦我的访问令牌过期,我如何使用存储的刷新令牌再次刷新我的访问令牌? 我搜索了JavaScript SDK,但找不到任何方法来做同样的事情。我肯定错过了什么。 我还想通过Lam

  • 我理解客户机应用程序使用refresh_token(连同它的凭据)为最终用户(资源所有者)获取新的访问令牌,而不是存储最终用户的用户名/密码,并在每次access_token过期时发送它们。 然而,在我看来,这听起来像refresh_token和access_token一样好,它几乎只是一个额外的服务器调用,所以为什么不直接使用它,即如果refresh token是有效的授予访问权限呢?

  • 我正在编写一个应用程序,调用来自Flutter的google fit rest api。 我需要使用(https://pub.dev/packages/google_sign_in)与谷歌签名。我可以毫无问题地获得一个令牌(见是否有人设法从谷歌登录(Flutter)获得id令牌),但如何获得一个新的令牌时,它是过期的? 我不想要求用户每小时登录并获得一个新的令牌

  • 我编写了一个控制台ASP.NET应用程序来获取AccessTokens。我有clientId,我的应用程序的客户端秘密,我做了以下操作: var authContext=新的AuthenticationContext(“https://login.windows.net/common/oauth2/authorize”);var acquireTask=authContext.AcquireTok

  • 我需要使用json格式刷新GA令牌,但我无法使其工作。使用参数时效果非常好。请让我知道如果你看到任何缺陷!谢谢!!!! Works(无JSON)= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = curl-d " client _ id = { myId } 不起作用 (json) ====