Node.js 使用passport库访问Microsoft Graph API时,CompactToken解析失败,错误代码为80049217
我正在使用'passport-azure-ad-oauth2'npm模块获取访问令牌,然后将其传递给MS-Graph APINode.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.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);