客户端(React Js)-@azure/msal-react,@azure/msal-browser 服务器(Express Js) - Passport-azure-ad
var options = {
identityMetadata:"https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration",
clientID:"<client-id>",
validateIssuer:true,
issuer: "https://login.microsoftonline.com/<tenant-id>/v2.0",
passReqToCallback: false,
allowMultiAudiencesInToken: false,
audience:"<client-id>",
loggingLevel: "info",
loggingNoPII: false,
scope: ["User.Read"],
};
var bearerStrategy = new BearerStrategy(options,
function(token, done) {
log.info('verifying the user');
log.info(token, 'was the token retreived');
findById(token.oid, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
// "Auto-registration"
log.info('User was added automatically as they were new. Their oid is: ', token.oid);
users.push(token);
owner = token.oid;
return done(null, token);
}
owner = token.oid;
return done(null, user, token);
});
}
);
错误日志
{"name":"AzureAD: 承载策略","hostname":"xxxxx-xxxxx","pid":xxxxx,"level":x,"msg":"身份验证失败,原因是:签名无效","时间":"xxxx","v":0}
尽管服务器从标头中的客户端接收到
accessToken
作为授权承载令牌,但服务器会解析该令牌并解码该令牌以提供用户信息。但生成 pemKey 后,我收到上述错误日志。
此错误日志可能是什么原因?
任何帮助表示赞赏,谢谢
我创建了一个 Azure AD 应用程序并授予了 API 权限,如下所示:
使用以下参数通过 Postman 生成访问令牌:
https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
scope:user.read
grant_type:authorization_code
redirect_uri:https://jwt.ms
code:code
client_secret:ClientSecret
当我解码访问令牌时,我得到了相同的错误,如下所示:
注意:不应验证为 Microsoft Graph API 生成的令牌,因为它不适用于应用程序。正如 Sérgio Correia 所建议的,只有 Microsoft Graph 可以验证为 MS Graph 本身发行的令牌。
只能验证为您的应用程序生成的访问令牌。
因此,要解决该错误,您可以公开 API,如下所示:
添加API权限:
我通过将 scope 传递为
api://ClientID/test.read
来生成访问令牌
现在签名已验证成功,如下所示: