3

我在使用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"

我可以看到's 标头kidid_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 的密钥
4

1 回答 1

1

所以,事实证明我在 Azure Active Directory 中创建了一个 v1 应用程序,虽然这在任何地方都不清楚,并且id_token说它是ver: 2.0但它不是....

如果你想要 Azure AD 中的 v2.0 应用程序,你不能从该Enterprise Applications部分创建它,你必须使用该App registrations (Preview)部分。

这解决了我的问题,并且id_token在我删除我的应用程序并正确重新创建它之后包含一个有效的 KID。

希望这对遇到同样问题的人有所帮助!

有用的链接:https ://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app

如果 Azure 中的任何人阅读此内容,请知道添加(Preview)任何部分的标题意味着我不会自动单击它,因为它似乎并不重要。但是,在这种情况下,这是创建 v2.0 应用程序的唯一方法!

于 2019-04-04T14:12:03.967 回答