使用passport-azure-ad
库时遇到问题,该库在尝试验证id_token
时抛出错误。特定错误消息为"authentication failed due to: In _validateResponse: failed to generate PEM key due to: a key with kid %s cannot be found"
我看到kid
标题中的id_token
是一个没有出现在密钥发现端点(格式为https://login.microsoftonline.com/{tenantId}/discovery/v2.0/keys
)中的值。
有什么可能会发生这种情况吗?我无法弄清楚。
我的代码如下:
passport.use(
new OIDCStrategy({
clientID: CLIENT_ID,
clientSecret: CLIENT_SECRET,
identityMetadata: IDENTITY_METADATA_URL,
redirectUrl: SUCCESS_REDIRECT_URI,
responseMode: 'form_post',
responseType: 'code',
scope: 'email profile',
loggingLevel: 'info',
loggingNoPII: false
})
)
app.get(
'/oauthv2/login',
passport.authenticate(
'azuread-openidconnect',
{ failureRedirect: '/fail' },
(req, res) => {
// ...
}
)
)
app.post(
'/oauthv2/success',
passport.authenticate(
'azuread-openidconnect',
{ failureRedirect: '/' },
(req, res) => {
// ...
}
)
)
从pazzport-azure-ad
日志中,我可以看到在错误发生之前已执行以下步骤:
答案 0 :(得分:0)
因此,事实证明我已经在Azure Active Directory中创建了v1应用程序,尽管目前还不清楚,并且let approved = ""; // string!
for (const approve of requestApproval[strings.Approve]) {
approved += approve.Title + '<br/>';
}
表示它是<td align="center">${approved.join("")}</td>
,但事实并非如此。...
如果要在Azure AD中使用v2.0应用程序,则无法从id_token
部分创建它,而必须使用ver: 2.0
部分。
这解决了我的问题,Enterprise Applications
删除了我的应用并正确重新创建后,其中包含一个有效的KID。
希望这可以帮助遇到相同问题的任何人!
有用的链接:https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app
如果来自Azure的任何人都读过此书,请知道在任何部分的标题中添加App registrations (Preview)
意味着我不会自动单击它,因为它似乎并不重要。但是,在这种情况下,这是创建v2.0应用程序的唯一方法!