单点登录 SSO

单点登录是一种允许使用外部提供商登录系统的机制。 例如,您可以使用您的 Google 或 Facebook 帐户在系统中进行身份验证,而无需在这些系统上创建新注册。

支持的 SSO 机制

Directus 支持四种标准类型的 SSO 机制:

以下是每个允许的配置:SSO 配置

为了使用这些机制,您需要:

  1. 在您首选的外部提供商上创建应用程序/配置
  2. 设置环境变量配置外部提供者
  3. 可选 设置环境变量来配置cookies

OpenID

在本节中,我们提供了一些指南来帮助您使用 OpenID 设置 SSO。

谷歌

为了能够使用 Google OpenID 作为您的外部提供商,您需要:

  1. 进入谷歌云控制台
  2. 选择或创建一个新项目
  3. 前往 APIs & Services -> OAuth 同意屏幕 酒吧
    1. 选择您想要的访问权限
      • 如果您只希望组织内的人员能够访问,请选择 Internal
      • 选择 External 以允许拥有 Google 帐户的所有人
    2. 根据您的喜好填写字段
      • 授权域添加了额外的安全层,但这不是必需的。如果您填写它,应该是您的 Directus 实例所在的域
    3. 在Scopes上,需要选择.../auth/userinfo.email.../auth/userinfo.profileopenid
  4. 在侧边栏,转到 Credentials
  5. 点击创建凭据 -> OAuth 客户端 ID
    1. Application Type上选择Web Application
    2. Authorized JavaScript origins 增加了额外的安全层,但这不是必需的。如果您填写它,应该是您的 Directus 实例的地址。例如,https://directus.myserver.com
    3. Authorized redirect URIs 上,将您的 Directus 实例地址加上/auth/login/google/callback。例如,您应该将 https://directus.myserver.com/auth/login/google/callback 放在其中 https://directus.myserver.com 应该是 Directus 实例的地址。如果你在本地测试,你应该添加http://localhost:8055/auth/login/google/callback
  6. 点击 Create,将出现一个带有 Client IDClient Secret 的模式。将两者保存在某个地方以备后用。
  7. 现在在 Directus 端,您需要将以下配置添加到位于项目根文件夹的 .env 文件中:
sh
AUTH_PROVIDERS="google"

AUTH_GOOGLE_DRIVER="openid"
AUTH_GOOGLE_CLIENT_ID="XXXX" # 将 XXXX 替换为第 6 步中的客户端 ID
AUTH_GOOGLE_CLIENT_SECRET="XXXX" # 将 XXXX 替换为第 6 步中的客户端密码
AUTH_GOOGLE_ISSUER_URL="https://accounts.google.com"
AUTH_GOOGLE_IDENTIFIER_KEY="email"
AUTH_GOOGLE_ICON="google"
AUTH_GOOGLE_ALLOW_PUBLIC_REGISTRATION="true" # 这允许在登录时自动创建用户。 如果要手动创建用户,请使用“false”
AUTH_GOOGLE_DEFAULT_ROLE_ID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" # 将此替换为您希望新用户使用的 Directus 角色 ID。 如果配置不正确,新用户将无法访问 Directus
  1. 现在您可以在 Directus 登录页面上看到一个不错的功能性“使用 Google 登录”按钮。

无缝(Seamless) SSO

虽然有时您希望您的用户直接访问 Directus 应用程序,但在其他情况下,您可能需要使用外部提供程序从客户端中的 Directus 获取私有数据。 在这种情况下,需要一个特殊的配置来跨域工作,但很简单:

  1. 设置外部提供商。 您有一些关于 支持的 SSO 机制 的示例
  2. 允许跨域访问cookie。 将以下配置放在 .env 上:
bash
REFRESH_TOKEN_COOKIE_DOMAIN="XXXX" # 将 XXXX 替换为您的 Directus 实例的域。 例如“directus.myserver.com”
REFRESH_TOKEN_COOKIE_SECURE="true"
REFRESH_TOKEN_COOKIE_SAME_SITE="None"
  1. 在您的客户端上,您的登录按钮应该类似于
html
<a href="https://directus.myserver.com/auth/login/google?redirect=https://client.myserver.com/login">Login</a>
  • https://directus.myserver.com 应该是 Directus 实例的地址
  • 虽然 https://client.myserver.com/login 应该是您的客户端应用程序的地址。 /login 不是必需的,但有助于分离关注点
  1. 在您的登录页面上,示例应为https://client.myserver.com/login,您需要通过 REST API 或 SDK 调用刷新端点以检索access_token
    • via REST API / fetch
      js
      await fetch('https://directus.myserver.com/auth/refresh', {
        method: 'POST',
        credentials: 'include', // 这是发送刷新令牌 cookie 所必需的
      })
      
    • via SDK
      js
      const sdk = new Directus('https://directus.myserver.com')
      
      await sdk.auth.refresh()