如何在 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);
}
我正在实施“使用 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);
}