我的授权客户端:angular,资源服务器:java spring boot,授权服务器:azure active directory
我使用oauth2通过pkce授权流通过angular登录,然后将令牌传递到后端。我可以通过authorization beaer头访问后端中的令牌,但是当我使用该令牌访问microsoft graph api时,会出现无效令牌异常。
com.microsoft.graph.http.graphserviceexception:错误代码:invalidauthenticationtoken错误消息:compacttoken分析失败,错误代码:80049217
我不知道为什么它会导致这个错误,因为它是有效的,我可以通过验证https://jwt.io/ 并使用令牌访问我在postman中的另一个受保护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);
}
}
安全配置.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;
}
我的Angular 设置:
app.module:从'angular-oauth2-oidc'导入{oauthmodule};
应用组件.ts
Postman :
1条答案
按热度按时间hk8txs481#
一个访问令牌只能用于一个资源。我看得出你
scope: 'openid api://{appid}/app'
在你的Angular 设置。这意味着访问令牌用于此资源api://{appid}/app
而不是microsoft graphhttps://graph.microsoft.com
. 这就是为什么出现invalidauthenticationtoken错误。因此,如果您想在后端api中调用microsoft graph,则需要考虑代表flow的oauth 2.0。oauth2.0代表流(obo)服务于这样一个用例:应用程序调用服务/webapi,而服务/webapi又需要调用另一个服务/webapi。
在您的例子中,您的后端api是web api a,而microsoft graph是web api b。
供你参考的样品。