单点登录 Single Sign-on (SSO)

Strapi 的 SSO 允许您为管理面板配置其他登录和注册方法。它需要企业版和黄金计划。

Strapi 上的单点登录允许您为管理面板配置其他登录和注册方法。 企业版

  • 需要运行 3.5.0 或更高版本的 Strapi 应用程序。
  • 要在您的应用程序上配置 SSO,您需要具有 Gold 计划 的 EE 许可证。
  • 确保 SSO 功能已 在管理面板中启用
  • 确保 Strapi 是您可以通过提供商访问的应用程序的一部分。例如,使用 Microsoft (Azure) Active Directory,您必须首先请求具有正确权限的人将 Strapi 添加到允许的应用程序列表中。请参阅您的提供商文档以了解更多信息。

目前无法将唯一的 SSO 提供商与用于 Strapi 帐户的电子邮件地址关联,这意味着无法将对 Strapi 帐户的访问限制为仅一个 SSO 提供商。有关解决此问题的更多信息和解决方法,请参阅专用的 GitHub 问题

SSO 配置位于应用程序的服务器配置中,位于 ./config/admin.js

访问配置

提供商的配置应写入管理面板配置的 auth.providers 路径中。

auth.providers提供商配置 的数组。

js
./config/admin.js
js
module.exports = ({ env }) => ({
  // ...
  auth: {
    providers: [], // 提供商的配置位于此处
  },
})

设置提供程序配置

提供程序的配置是一个 JavaScript 对象,具有以下属性:

名称必需类型说明
uidtrue字符串策略的 UID。它必须与策略的名称匹配
displayNametrue字符串将在登录页面上用于引用提供程序的名称
iconfalse字符串图像 URL。如果指定,它将替换登录页面上的 displayName
createStrategytrue函数为您的提供程序构建并返回新护照策略的工厂。以 strapi 实例作为参数

uid 属性是每个策略的唯一标识符,通常位于策略的包中。如果您不确定它指的是什么,请联系策略的维护者。

默认情况下,Strapi 安全策略不允许从外部 URL 加载图像,因此提供商徽标不会显示在管理面板的 登录屏幕 上,除非 添加安全例外

示例:提供商徽标的安全例外情况

jsx
./config/middlewares.js
jsx
module.exports = [
  // ...
  {
    name: 'strapi::security',
    config: {
      contentSecurityPolicy: {
        useDefaults: true,
        directives: {
          'connect-src': ['\'self\'', 'https:'],
          'img-src': [
            '\'self\'',
            'data:',
            'blob:',
            'dl.airtable.com',
            'www.okta.com', // 提供商徽标的基本 URL
          ],
          'media-src': [
            '\'self\'',
            'data:',
            'blob:',
            'dl.airtable.com',
            'www.okta.com', // 提供商徽标的基本 URL
          ],
          'upgradeInsecureRequests': null,
        },
      },
    },
  },
  // ...
]

When deploying the admin panel to a different location or on a different subdomain, an additional configuration is required to set the common domain for the cookies. This is required to ensure the cookies are shared across the domains.

Deploying the admin and backend on entirely different unrelated domains is not possible at this time when using SSO.

jsx
./config/admin.js
jsx
module.exports = ({ env }) => ({
  auth: {
    domain: env('ADMIN_SSO_DOMAIN', '.test.example.com'),
    providers: [
      // ...
    ],
  },
  url: env('ADMIN_URL', 'http://admin.test.example.com'),
  // ...
})

createStrategy 工厂

护照策略通常通过使用 2 个参数实例化来构建:配置对象和验证函数。

配置对象

配置对象取决于策略需求,但通常会要求在提供商端建立连接后重定向到回调 URL。

可以使用 getStrategyCallbackURL 方法为您的提供商生成特定的回调 URL。还需要在提供商端写入此 URL 以允许从其重定向。

回调 URL 的格式如下:/admin/connect/<provider_uid>

strapi.admin.services.passport.getStrategyCallbackURL 是一个 Strapi 助手,您可以使用它来获取特定提供商的回调 URL。它将提供商名称作为参数并返回 URL。

如果需要,这也是您放置 OAuth2 应用程序的客户端 ID 和密钥的地方。

验证函数

验证函数在此用作中间件,允许用户转换并从提供程序 API 返回的数据并进行额外处理。

此函数始终将 done 方法作为最后一个参数,用于将所需数据传输到 SSO 的 Strapi 层。

其签名如下:void done(error: any, data: object);,并遵循以下规则:

  • 如果 error 未设置为 null,则发送的数据将被忽略,并且控制器将抛出错误。
  • 如果 SSO 的自动注册功能被禁用,则 data 对象只需要由 email 属性组成。
  • 如果启用了 SSO 的自动注册功能,则您需要在 data 对象中定义(除了 emailusername 属性或 firstnamelastname

添加提供商

添加新提供商意味着为您的管理员添加一种新的登录方式。

Strapi 使用 Passport.js,它支持大量提供商。因此,任何不需要额外自定义数据的有效护照策略都应该适用于 Strapi。

诸如 ldapauth 之类的策略不是开箱即用的,因为它们需要从管理面板发送额外的数据。 如果您想将 LDAP 提供商添加到您的应用程序,您需要编写一个 自定义策略。 您还可以使用 Okta 和 Auth0 等服务作为桥接服务。

配置提供程序

要配置提供程序,请按照以下步骤操作:

  1. 确保在管理配置文件中导入策略,无论是从已安装的包还是本地文件。
  2. 您需要在管理面板配置中的 auth.providers 数组中添加一个新项目,该项目将与 上面给出的格式 匹配
  3. 重新启动应用程序,提供程序应出现在管理员登录页面上。

提供程序配置示例

Google

Using: passport-google-oauth2

sh
yarn
sh
yarn add passport-google-oauth2