支持的 SSO 机制
Directus 支持四种标准类型的 SSO 机制:
以下是每个允许的配置:SSO 配置
为了使用这些机制,您需要:
- 在您首选的外部提供商上创建应用程序/配置
- 设置环境变量配置外部提供者
- 可选 设置环境变量来配置cookies
OpenID
在本节中,我们提供了一些指南来帮助您使用 OpenID 设置 SSO。
谷歌
为了能够使用 Google OpenID 作为您的外部提供商,您需要:
- 进入谷歌云控制台
- 选择或创建一个新项目
- 前往 APIs & Services -> OAuth 同意屏幕
酒吧
- 选择您想要的访问权限
- 如果您只希望组织内的人员能够访问,请选择 Internal
- 选择 External 以允许拥有 Google 帐户的所有人
- 根据您的喜好填写字段
- 授权域添加了额外的安全层,但这不是必需的。如果您填写它,应该是您的 Directus 实例所在的域
- 在Scopes上,需要选择
.../auth/userinfo.email
、.../auth/userinfo.profile
和openid
- 选择您想要的访问权限
- 在侧边栏,转到 Credentials
- 点击创建凭据 -> OAuth 客户端 ID
- 在Application Type上选择
Web Application
- Authorized JavaScript origins 增加了额外的安全层,但这不是必需的。如果您填写它,应该是您的 Directus 实例的地址。例如,
https://directus.myserver.com
- 在 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
- 在Application Type上选择
- 点击 Create,将出现一个带有 Client ID 和 Client Secret 的模式。将两者保存在某个地方以备后用。
- 现在在 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
- 现在您可以在 Directus 登录页面上看到一个不错的功能性“使用 Google 登录”按钮。
无缝(Seamless) SSO
虽然有时您希望您的用户直接访问 Directus 应用程序,但在其他情况下,您可能需要使用外部提供程序从客户端中的 Directus 获取私有数据。 在这种情况下,需要一个特殊的配置来跨域工作,但很简单:
- 设置外部提供商。 您有一些关于 支持的 SSO 机制 的示例
- 允许跨域访问cookie。 将以下配置放在
.env
上:
bash
REFRESH_TOKEN_COOKIE_DOMAIN="XXXX" # 将 XXXX 替换为您的 Directus 实例的域。 例如“directus.myserver.com”
REFRESH_TOKEN_COOKIE_SECURE="true"
REFRESH_TOKEN_COOKIE_SAME_SITE="None"
- 在您的客户端上,您的登录按钮应该类似于
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
不是必需的,但有助于分离关注点
- 在您的登录页面上,示例应为
https://client.myserver.com/login
,您需要通过 REST API 或 SDK 调用刷新端点以检索access_token
- via REST API / fetchjs
await fetch('https://directus.myserver.com/auth/refresh', { method: 'POST', credentials: 'include', // 这是发送刷新令牌 cookie 所必需的 })
- via SDKjs
const sdk = new Directus('https://directus.myserver.com') await sdk.auth.refresh()
- via REST API / fetch