【问题标题】:ValidationError: "tenantId" is not allowed when using AzureAD for hapi JS route authorizationValidationError:使用 AzureAD 进行 hapi JS 路由授权时不允许使用“tenantId”
【发布时间】:2019-11-19 12:42:00
【问题描述】:

我们正在尝试在我们的后端路由上使用@hapi/bell 来提供授权。认证策略使用azure作为provider,方案为bell

这就是我注册策略的方式。 clientIdclientSecrettenantIdpassword 是隐藏的,原因很明显

server.auth.strategy('azureAD', 'bell', { provider: 'azure', clientId: '...', clientSecret: '...', tenantId: '...', password: '...', providerParams: { response_type: 'code' }, scope: ['openid', 'offline_access', 'profile', 'User.Read'] })

当我运行服务器时,我收到以下错误:

{ [ValidationError: "tenantId" is not allowed] ...

现在,查看 azure 门户,我们肯定希望只支持组织内部的帐户,即单租户。

如果我删除 tenantId 选项并重新启动服务器,我会收到 CORS 错误,这实际上表示我们的应用程序未配置为多租户应用程序,我们需要使用特定于租户的端点或将应用程序配置为多租户。但是,添加tenantId 表示不允许。

任何关于为什么会发生这种情况的指导都将受到高度赞赏。

【问题讨论】:

  • 我不熟悉 hapijs,但我对 js 本身很熟悉,它们被认为是公共应用程序。这意味着不需要客户端机密(因为它将暴露给世界,为黑客打开一扇巨大的大门)。也许this doc 可以帮助你。
  • “在我们的后端路由上”它是一个机密客户端。
  • @TiagoBrenck 如果我删除了客户端密码,服务器不会运行并抛出一个错误,指出需要客户端密码。
  • @juunas 不太清楚你的意思,你能详细说明一下吗?
  • 我在回答 TiagoBrenck 的评论,即您不应该将客户端机密放在公共客户端中。根据我在您的问题中的理解,您的代码在后端运行,因此是一个机密客户端,它可以使用客户端密码来验证自己。

标签: azure azure-active-directory hapijs


【解决方案1】:

我发现,可以执行以下操作,而不是像我在问题中显示的那样注册策略:

const custom = Bell.providers.azure({ tenant: '...' })

server.auth.strategy('azureAD', 'bell', {
  provider: custom,
  clientId: '...',
  clientSecret: '...',
  password: '...',
  isSecure: false, // look into this, not a good idea but required if not using HTTPS
  providerParams: {
    response_type: 'code'
  },
  scope: ['openid', 'offline_access', 'profile', 'User.Read']
})

这消除了 "tenantId" is not allowed 错误,但是,我们现在得到一个不同的错误,说明 Authentication failed due to: Missing custom request token cookie

Bell 建议一个常见的解决方案是将 bell 与 hapi-auth-cookie 身份验证方案插件结合使用,所以现在需要研究一下。

【讨论】:

    【解决方案2】:

    Joi 包正在验证架构并引发错误。请参阅下面的配置属性。它会覆盖选项并避免您看到的“tenantId”或“tenant”不允许错误。此外,在最近的版本中,Bell Azure Provider 想要“tenant”而不是“tenantId”属性。

    server.auth.strategy('azureAD', 'bell', {
      provider: 'azure',
      config: {
        tenant: '...',
        useParamsAuth: false,
      },
      clientId: '...',
      clientSecret: '...',
      password: '...',
      providerParams: {
        response_type: 'code'
      },
      scope: ['openid', 'offline_access', 'profile', 'User.Read'],
      isSecure: false,
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-31
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2016-04-07
      相关资源
      最近更新 更多