Node.js 使用passport库访问Microsoft Graph API时,CompactToken解析失败,错误代码为80049217

Node.js 使用passport库访问Microsoft Graph API时,CompactToken解析失败,错误代码为80049217,node.js,microsoft-graph-api,auth0,adal,microsoft-graph-calendar,Node.js,Microsoft Graph Api,Auth0,Adal,Microsoft Graph Calendar,我正在使用'passport-azure-ad-oauth2'npm模块获取访问令牌,然后将其传递给MS-Graph API passport.use(新AzureadoAuth2策略)({ clientID:process.env.OUTLOOK\u CLIENT\u ID, clientSecret:process.env.OUTLOOK\u SECRET, callbackURL:“/auth/outlook/callback”, }, 函数(accesstoken:any,refresh

我正在使用'passport-azure-ad-oauth2'npm模块获取访问令牌,然后将其传递给MS-Graph API

passport.use(新AzureadoAuth2策略)({
clientID:process.env.OUTLOOK\u CLIENT\u ID,
clientSecret:process.env.OUTLOOK\u SECRET,
callbackURL:“/auth/outlook/callback”,
},
函数(accesstoken:any,refresh\u token:any,params:any,profile,done){
logger.info('Completed azure sign-in for:'+JSON.stringify(profile));
logger.info('返回的参数:'+JSON.stringify(params));
const decodedIdToken:any=jwt.decode(params.id_token);
logger.info('Outlook访问令牌:'+accesstoken);
info('decodedtoken:'+JSON.stringify(decodedIdToken,null,2));
process.env['OUTLOOK\u ACCESS\u TOKEN']=accesstoken;
//在数据库中的此处添加带有令牌的新用户或更新用户令牌
}));
然后,使用“@microsoft/microsoft graph client”npm模块从graph API获取日历事件,如下所示:

try {
    const client = this.getAuthenticatedClient(process.env['OUTLOOK_ACCESS_TOKEN']);
    const resultSet = await client
                .api('users/' + userId + '/calendar/events')
                .select('subject,organizer,start,end')
                .get();
    logger.info(JSON.stringify(resultSet, null, 2));
} catch (err) {
    logger.error(err);
}

getAuthenticatedClient(accessToken) {
    logger.info('Using accestoken for initialising Graph Client: ' + accessToken);
    const client = Client.init({
        // Use the provided access token to authenticate requests
        authProvider: (done) => {
            done(null, accessToken);
        }
    });

    return client;
}
但是,使用成功登录时提供的accessToken,我得到以下错误: CompactToken解析失败,错误代码为80049217

有什么建议我做错了什么

更新: 这些是我正在使用的范围:“openid、配置文件、脱机访问、日历。读取”

更新: 在编辑了一些作用域之后,现在我得到了以下错误:无效的访问者

解码在jwt.ms接收到的令牌时,这是“aud”的值:“00000002-0000-0000-c000-000000000000”


是否passport-azure-ad-oauth2是检索MS Graph API令牌的错误库

根据我的测试,我们可以使用以下代码获取访问令牌。 app.js


有关更多详细信息,请参阅和。

原来有一个用于microsoft graph api的passport库:passport microsoft

我使用了该软件包中的MicrosoftStrategy,一切似乎都很好


passport-azure-ad-oauth2用于旧的azure ad Graph API,而passport microsoft用于新的microsoft Graph API

我也遇到了同样的问题。在我的情况下,授权标头的格式不正确:

BeareReyxxx

而不是

持票人eyxxxx


我是该项目的新手,但Azure似乎事先就接受了它。

我解决了这个问题,只通过authenticationProvider中的accessToken,而不是旧的“承载者”+令牌:例如:

TokenCredential tokenCredential = tokenRequestContext -> Mono.just(new AccessToken(accessToken, OffsetDateTime.MAX));
IAuthenticationProvider authenticationProvider = new TokenCredentialAuthProvider(tokenCredential);

我试过这个,但是这个策略需要会话。我们已经在使用jwt了。有没有一种方法可以在没有会话的情况下使用此策略?你是什么意思?你想在我正在开发的产品中使用AzureAdOAuth2Strategy吗。我们使用GoogleOAuth2,使用passport模块登录并获取访问令牌,该令牌用于获取用户的日历事件。现在我正试图将office 365集成到同一个系统中。然而,我们已经使用jwt来存储身份验证数据,所以不要认为OIDCSTRAGY适合这里,因为它使用会话。我需要一个可以与JWT一起使用的策略根据我的错误消息,请您捕获
process.env['OUTLOOK\u ACCESS\u TOKEN']=accesstoken
要打印您的访问令牌吗?事实证明,passport-azure-ad-oauth2为旧的azure ad Graph API提供访问令牌。因此,我切换到passport microsoft,它为新的microsoft图形检索令牌。如果您的问题已经解决,请接受答案。它可以帮助更多的人。
TokenCredential tokenCredential = tokenRequestContext -> Mono.just(new AccessToken(accessToken, OffsetDateTime.MAX));
IAuthenticationProvider authenticationProvider = new TokenCredentialAuthProvider(tokenCredential);