Мой клиент авторизации: Angular, сервер ресурсов: Java Spring Boot, сервер авторизации: Azure Active Directory
Я использую oAuth2 для входа через Angular через поток авторизации PKCE, а затем передаю токен на сервер. Я могу получить доступ к токену в своей серверной части через заголовок Authorization Beaer, но когда я использую этот токен для доступа к Microsoft Graph API, я получаю исключение Invalid token.
com.microsoft.graph.http.GraphServiceException: Код ошибки: InvalidAuthenticationToken Сообщение об ошибке: Ошибка синтаксического анализа CompactToken с кодом ошибки: 80049217
Я не уверен, почему это вызывает эту ошибку, потому что она действительна, и я могу проверить через https://jwt.io/ и получить доступ к моему другому защищенному API в почтальоне с токеном.
AuthProvider.java
public class AuthProvider implements IAuthenticationProvider {
private String accessToken = null;
public AuthProvider(String accessToken) {
this.accessToken = accessToken;
}
@Override
public void authenticateRequest(IHttpRequest request) {
// Add the access token in the Authorization header
request.addHeader("Authorization", "Bearer " + accessToken);
}
}
SecurityConfiguration.java
http.cors().and()
.authorizeRequests().antMatchers("/home").permitAll()
.and()
.authorizeRequests().antMatchers("/actuator/health").permitAll()
.and()
.authorizeRequests().antMatchers("/**").authenticated()
.and()
.oauth2ResourceServer().jwt();
GraphAPIController.java
private static IGraphServiceClient graphClient = null;
private static AuthProvider authProvider = null;
private static void ensureGraphClient(String accessToken) {
if (graphClient == null) {
// Create the auth provider
authProvider = new AuthProvider(accessToken);
// Create default logger to only log errors
DefaultLogger logger = new DefaultLogger();
logger.setLoggingLevel(LoggerLevel.ERROR);
// Build a Graph client
graphClient = GraphServiceClient
.builder()
.authenticationProvider(authProvider)
.logger(logger)
.buildClient();
}
}
@GetMapping("/getUser")
public static User getUser(@RequestHeader(value = "Authorization") String token) {
System.out.println("THE TOKEN: " +token);
ensureGraphClient(token);
// GET /me to get authenticated user
User me = graphClient
.me()
.buildRequest()
.get();
System.out.println("THE USER: " + me);
return me;
}
Моя угловая настройка:
приложение.модуль: импортировать {OAuthModule} из 'angular-oauth2-oidc';
app.component.ts
Почтальон:
@AllenWu я добавил в дополнительный код
Опубликовали ответ. Если это полезно для вас, вы можете принять его как ответ (нажмите на галочку рядом с ответом, чтобы переключить его с серого на заполненный). См. meta.stackexchange.com/questions/5234/…. Это может быть полезно другим участникам сообщества. Спасибо.
Привет, у тебя была возможность заглянуть в мой ответ? Любые обновления?




Токен доступа может быть только для одного ресурса. Я вижу, что вы настраиваете scope: 'openid api://{appid}/app' в настройках Angular. Это означает, что токен доступа предназначен для этого ресурса api://{appid}/app, а не для Microsoft Graph https://graph.microsoft.com. Вот почему вы получили ошибку InvalidAuthenticationToken.
Поэтому, если вы хотите вызывать Microsoft Graph в своем внутреннем API, вам необходимо учитывать OAuth 2.0 On-Behalf-Of flow. Поток OAuth 2.0 On-Behalf-Of (OBO) служит для случая использования, когда приложение вызывает службу/веб-API, который, в свою очередь, должен вызывать другую службу/веб-API.
В вашем случае ваш внутренний API — это веб-API A, а Microsoft Graph — веб-API B.
Образец для ознакомления.
Спасибо за помощь! Это именно то, что я искал. Я собираюсь реализовать поток On-Behalf-Of
Для доступа к какому «другому защищенному API» вы можете использовать этот токен? Можете ли вы предоставить запрос? Кроме того, пожалуйста, поделитесь кодом о том, как вы получаете токен доступа.