microsoft graph sdk for java-invalidauthenticationtoken错误80049217

hkmswyz6  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(533)

我的授权客户端: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 :

hk8txs48

hk8txs481#

一个访问令牌只能用于一个资源。我看得出你 scope: 'openid api://{appid}/app' 在你的Angular 设置。这意味着访问令牌用于此资源 api://{appid}/app 而不是microsoft graph https://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。

供你参考的样品。

相关问题