由于错误的KID

时间:2019-04-02 10:40:26

标签: javascript node.js openid-connect passport-azure-ad

使用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日志中,我可以看到在错误发生之前已执行以下步骤:

  • 收到id_token
  • 收到access_token
  • 收到refresh_token
  • 已解密令牌
  • 研究密钥
  • 研究密钥
  • 研究密钥
  • 由于以下原因,身份验证失败:在_validateResponse中:由于以下原因,未能生成PEM密钥:找不到带有孩子%s的密钥

1 个答案:

答案 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应用程序的唯一方法!