如何在 Microsoft 授权码流程中获取刷新令牌 - java sdk

How to obtain refresh token in Microsoft Authorization Code flow - java sdk

我正在实施“使用 Microsoft 按钮登录”,我需要将刷新令牌存储在我的数据库中,以便将来可以使用它来获取新的访问令牌。我正在尝试使用 Java sdk for microsoft graph 来做到这一点。

编辑 1: 我实际上想使用我的 Web 应用程序创建日历事件。因此,目标是让 Web 应用程序在没有登录用户的情况下访问 Graph API。

代码如下所示:

AuthorizationCode authorizationCode = new AuthorizationCode(httpServletRequest.getParameter("code"));
        String currentUri = httpServletRequest.getRequestURL().toString();
        
        IAuthenticationResult result;
        ConfidentialClientApplication app;
        try {
            app = createClientApplication();

            String authCode = authorizationCode.getValue();
            Set<String> scopes = new HashSet<String>();
            scopes.add("Calendars.ReadWrite");
            
            AuthorizationCodeParameters parameters = AuthorizationCodeParameters.builder(authCode, new URI(currentUri)).scopes(scopes)
                    .build();
            
            Future<IAuthenticationResult> future = app.acquireToken(parameters);
            result = future.get();
        
        } catch (ExecutionException e) {
            throw e.getCause();
        }
String accessToken = result.accessToken();

/*
IAuthenticationResult does not contain any method to get the refresh token - how do I get the refresh token??

I want to do something like: result.refreshToken();
*/

IAuthenticationResult 由 AuthenticationResult 实现 -- 但是,AuthenticationResult 是在另一个 class 中声明的,而不是 public。 AuthenticationResult 公开了一种获取 refreshToken 的方法,但我无法访问它。

谁能帮我访问刷新令牌?

谢谢!

我从这个 link 得到了答案:https://github.com/AzureAD/microsoft-authentication-library-for-java/issues/228

简答:使用反射

try {
            //see com.microsoft.aad.msal4j.AuthenticationResult#refreshToken
            final Field refreshTokenField = result.getClass()
                .getDeclaredField("refreshToken");
            refreshTokenField.setAccessible(true);
            return refreshTokenField.get(result).toString();
        } catch (IllegalAccessException | NoSuchFieldException e) {
            throw new RuntimeException(e);
        }