我有一个 Angular 10 应用程序,我在该应用程序上使用 MSAL-Angular 包对 Azure AD 进行身份验证。它使用授权流程成功验证并检索 access_token
和 id_token
。
我还有一个 Express API 后端,我将 access_token 附加到(使用 Msal-Angular
中的拦截器)到请求的标头上。我想验证此令牌以验证 Angular 应用程序在允许访问 api 之前已通过身份验证。为此,我尝试将 passport-azure-ad
与 BearerStrategy 一起使用。我相信我已经正确设置了所有内容,但它一直告诉我无法验证令牌。
我发现如果我使用 id_token
而不是 access_token
它可以被验证;通过通行证策略并使用 jwt.io。
所以这里真正的问题是我可以在我的配置中做一些不同的事情来验证使用 access_token
传递的 Msal-Angular
还是我应该编写自己的拦截器来发送 id_token
而不是 access_token
?
API Passport 配置代码 - 我在这里要做的就是让护照验证通过,然后填写回调函数。
const options: IBearerStrategyOptionWithRequest = {
identityMetadata:
'https://login.microsoftonline.com/{tenet}.onmicrosoft.com/v2.0/.well-known/openid-configuration',
clientID: '{my_client_id}',
validateIssuer: true,
loggingLevel: 'info',
loggingNoPII: false,
passReqToCallback: true,
};
const bearerStrategy = new BearerStrategy(options,
function (req, token, done) {
logger.debug(req);
logger.debug(token);
return done(null, { name: 'user name' }, token);
});
passport.use(bearerStrategy);
保护路线
function (req, res, next) {passport.authenticate('oauth-bearer', { session: false }), listTasks);
给出错误:
{
"name":"AzureAD: Bearer Strategy",
"hostname":"my_host",
"pid":36344,
"level":30,
"msg":"authentication failed due to: invalid signature",
"time":"2021-03-02T20:50:02.140Z",
"v":0
}
答案 0 :(得分:1)
我想通了。这与我在 access_token 上获得的范围有关。我使用的是 'user.read'
和 'email'
,当我切换到使用 '{client_id}/.default'
时,结果令牌能够使用 v1 众所周知的元数据 URL 进行验证。
总的来说,我对范围仍然有点粗略,但这是我发现的导致解决我的问题的更改的页面。