Auth 是一个用 Go 编写的用户管理和身份验证服务器,为 Supabase 的以下功能提供支持:
它最初基于出色的 Netlify 的 GoTrue 代码库,但此后两者在功能和能力上已产生显著分歧。
如果你想为项目做贡献,请参阅贡献指南。
创建一个 .env 文件来存放你自己的自定义环境变量。参见 example.env
docker-compose -f docker-compose-dev.yml up postgresmake build。你应该会看到类似如下的输出:```bash
go build -ldflags "-X github.com/supabase/auth/cmd.Version=git rev-parse HEAD"
GOOS=linux GOARCH=arm64 go build -ldflags "-X github.com/supabase/auth/cmd.Version=git rev-parse HEAD" -o gotrue-arm643. 执行 auth 二进制文件:`./auth`
### 如果你已安装 Docker
创建一个 `.env.docker` 文件来保存你自己的自定义环境变量。参见 [`example.docker.env`](https://github.com/supabase/auth/blob/HEAD/example.docker.env)
1. `make build`
2. `make dev`
3. `docker ps` 应显示两个 Docker 容器(`auth-auth-1` 和 `auth-postgres-1`)
4. 就这样!访问[健康检查端点](http://localhost:9999/health)以确认 auth 正在运行。
## 在生产环境中运行
在生产环境中运行身份验证服务器并非易事。
我们建议使用 [Supabase Auth](https://supabase.com/auth),它会定期获得
安全更新。
否则,请确保你建立相应的流程,以便及时更新到
最新版本。你可以通过关注此仓库来实现,特别是
[Releases](https://github.com/supabase/auth/releases) 和 [安全
公告](https://github.com/supabase/auth/security/advisories) 板块。
### 向后兼容性
Auth 采用 [语义化版本](https://semver.org) 方案。以下是对
向后兼容性保证的进一步说明:
**Go API 兼容性**
Auth 并不是设计为 Go 库来使用的。
以这种方式使用时,无论版本号如何变化,都不保证
API 的向后兼容性。
**补丁版本**
补丁版本的更改保证与以下内容的向后兼容性:
- 数据库对象(表、列、索引、函数)。
- REST API
- JWT 结构
- 配置
保证的示例:
- 列的类型不会改变。
- 表的主键不会改变。
- 索引不会被移除。
- 唯一性约束不会被移除。
- REST API 不会被移除。
- REST API 的参数将和以前一样正常工作(或者更好,如果某个 bug
已被修复)。
- 配置不会改变。
不保证的示例:
- 表可能会添加新列。
- 表中的列可能会重新排序。
- 非唯一性约束可能会被移除(数据库级别的检查、null、默认
值)。
- JWT 可能会添加新的属性。
**次版本**
次版本号的更改保证与以下内容的向后兼容性:
- REST API
- JWT 结构
- 配置
只有在发现无法以其他方式修复的严重安全问题时,
才会对这些保证做出例外。
保证的示例:
- 现有 API 可能会被弃用,但在接下来的几个次版本
发布中仍能继续工作。
- 配置变更可能会被弃用,但在接下来的
几个次版本发布中仍能继续工作。
- 已签发的 JWT 仍会被接受,但新的 JWT 可能采用
不同的结构(不过通常相似)。
不保证的示例:
- 在弃用通知后移除 JWT 字段。
- 在弃用通知后移除某些 API。
- 在弃用通知后移除通过外部提供商登录的功能。
- 删除、截断,以及表、索引、视图、
函数的重大架构更改。
我们的目标是在执行日志中提供弃用通知,至少持续两个主
版本发布,如果多个版本同时发布,则至少持续两周。在通知有效期间,
兼容性将得到保证。
**主版本**
主版本号的更改不保证与先前版本的
任何向后兼容性。
### 继承的特性
某些从 Netlify 代码库继承的特性不受
Supabase 支持,将来可能会在没有事先通知的情况下被移除。以下是
这些特性的完整列表:
1. 通过 `instances` 表实现的多租户,即 `GOTRUE_MULTI_INSTANCE_MODE`
配置参数。
2. 系统用户(零 UUID 用户)。
3. 通过 `is_super_admin` 列实现的超级管理员。
4. 通过 `GOTRUE_JWT_ADMIN_GROUP_NAME` 和其他
配置字段在 JWT 中提供的组信息。
5. JWT 签名。Supabase Auth 支持非对称密钥(默认 RS256;
可选 ECC/Ed25519)。出于兼容性考虑,仍支持 HS256,但
建议迁移到非对称密钥,以便更轻松地验证和
轮换。未来的弃用将在变更日志中公告。详情请参阅
[JWT 签名密钥](https://supabase.com/docs/guides/auth/signing-keys) 和
[JWT 指南](https://supabase.com/docs/guides/auth/jwts)。
请注意,这并不是一个详尽的列表,并且可能会发生变化。
### 自托管时的最佳实践
以下是在自托管时应遵循的一些最佳实践,以确保与 Auth 的
向后兼容性:
1. 不要修改由 Auth 管理的架构。你可以在
`migrations` 目录中查看所有迁移。
2. 不要依赖数据库中的架构和数据结构。始终使用
Auth API 和 JWT 来推断用户信息。
3. 始终在支持 TLS 的代理后面运行 Auth,例如负载均衡器、CDN、
nginx 或其他类似软件。
## 配置
你可以使用名为 `.env` 的配置文件、
环境变量或两者结合来配置 Auth。环境变量以 `GOTRUE_` 为前缀,并且始终优先于通过文件提供的值。
### 顶层```properties
GOTRUE_SITE_URL=https://example.netlify.com/
SITE_URL - string 必需
你的站点所在的基准 URL。当前与其他设置结合使用,以构建电子邮件中使用的 URL。任何与 SITE_URL 共享主机的 URI 都是 redirect_to 参数允许的值(参见 /authorize 等)。
URI_ALLOW_LIST - string
一个逗号分隔的 URI 列表(例如 "https://foo.example.com,https://*.foo.example.com,https://bar.example.com"),这些 URI 被允许作为有效的 redirect_to 目标。默认为 []。通过 globbing 支持通配符匹配。例如 https://*.foo.example.com 将允许接受 https://a.foo.example.com 和 https://b.foo.example.com。Globbing 也支持子域名。例如 https://foo.example.com/* 将允许接受 https://foo.example.com/page1 和 https://foo.example.com/page2。
更常见的 glob 模式,请查看以下链接。
OPERATOR_TOKEN - string 仅多实例模式
与此微服务的操作方(通常是 Netlify)共享的密钥。用于验证请求已通过操作方代理并且 负载值可以信任。
DISABLE_SIGNUP - bool
当注册被禁用时,创建新用户的唯一方式是通过邀请。默认为 false,所有注册均启用。
GOTRUE_EXTERNAL_EMAIL_ENABLED - bool
使用此选项禁用电子邮件注册(用户仍可使用外部 OAuth 提供商进行注册 / 登录)
GOTRUE_EXTERNAL_PHONE_ENABLED - bool
使用此选项禁用手机注册(用户仍可使用外部 OAuth 提供商进行注册 / 登录)
GOTRUE_RATE_LIMIT_HEADER - string
用于对 /token 端点进行速率限制的请求头。此请求头预期由可信的上游代理(如 Kong 或 Envoy)设置。诸如 x-forwarded-for 之类的请求头是可伪造的,当客户端直接提供时不能信任用于速率限制。
GOTRUE_RATE_LIMIT_EMAIL_SENT - string
对以下端点上每小时发送的电子邮件数量进行速率限制:/signup、/invite、/magiclink、/recover、/otp 和 /user。
GOTRUE_PASSWORD_MIN_LENGTH - int
最小密码长度,默认为 6。
GOTRUE_PASSWORD_REQUIRED_CHARACTERS - 由 : 分隔的字符集字符串。密码必须至少包含每个字符集中的一个字符才能被接受。要使用 : 字符,请用 \ 将其转义。
GOTRUE_SECURITY_REFRESH_TOKEN_ROTATION_ENABLED - bool
如果启用了刷新令牌轮换,认证服务将自动检测重用已撤销刷新令牌的恶意尝试。当检测到恶意尝试时,GoTrue 会立即撤销从违规令牌派生的所有令牌。
GOTRUE_SECURITY_REFRESH_TOKEN_REUSE_INTERVAL - string
此设置仅在启用了 GOTRUE_SECURITY_REFRESH_TOKEN_ROTATION_ENABLED 时适用。刷新令牌的重用间隔允许在该间隔内多次交换刷新令牌,以支持并发或离线问题。在重用间隔期间,认证服务不会将使用已撤销令牌视为恶意尝试,而只会返回子刷新令牌。
只有先前已撤销的令牌才能被重用。使用远早于当前有效刷新令牌的旧刷新令牌将触发重用检测。
GOTRUE_API_HOST=localhost PORT=9999 API_EXTERNAL_URL=http://localhost:9999
`API_HOST` - `string`
要监听的主机名。
`PORT` (no prefix) / `API_PORT` - `number`
要监听的端口号。默认为 `8081`。
`API_ENDPOINT` - `string` _仅多实例模式_
控制 Netlify 可以访问此 API 的端点。
`API_EXTERNAL_URL` - `string` **必需**
GoTrue 可能被访问的 URL。
`REQUEST_ID_HEADER` - `string`
如果你希望从传入请求中继承请求 ID,请在此值中指定名称。
### 数据库```properties
GOTRUE_DB_DRIVER=postgres
DATABASE_URL=root@localhost/auth
DB_DRIVER - string 必需
选择你想要使用的数据库方言。必须为 postgres。
DATABASE_URL(无前缀)/ DB_DATABASE_URL - string 必需
数据库的连接字符串。
GOTRUE_DB_MAX_POOL_SIZE - int
设置数据库的最大打开连接数。默认值为 0,相当于“无限”数量的连接。
DB_NAMESPACE - string
为所有表名添加前缀。
迁移说明
当你运行 ./auth 时,迁移会自动应用。不过,你还可以通过以下方法重新运行迁移:
./auth migratedocker run --rm auth gotrue migrateLOG_LEVEL=debug # available without GOTRUE prefix (exception) GOTRUE_LOG_FILE=/var/log/go/auth.log
`LOG_LEVEL` - `string`
控制输出的日志级别。可从 `panic`、`fatal`、`error`、`warn`、`info` 或 `debug` 中选择。默认为 `info`。
`LOG_FILE` - `string`
如果希望将日志写入文件,请将 `log_file` 设置为有效的文件路径。
### 可观测性
Auth 内置了基本的可观测性。它能够导出
[OpenTelemetry](https://opentelemetry.io) 指标和追踪到收集器。
#### 追踪
要启用追踪,请配置以下变量:
`GOTRUE_TRACING_ENABLED` - `bool`
`GOTRUE_TRACING_EXPORTER` - `string` 仅支持 `opentelemetry`
请确保同时配置 [OpenTelemetry
Exporter](https://opentelemetry.io/docs/reference/specification/protocol/exporter/)
配置以适应你的收集器或服务。
例如,如果你使用
[Honeycomb.io](https://docs.honeycomb.io/getting-data-in/opentelemetry/go-distro/#using-opentelemetry-without-the-honeycomb-distribution)
则应设置这些标准的 OpenTelemetry OTLP 变量:```
OTEL_SERVICE_NAME=auth
OTEL_EXPORTER_OTLP_PROTOCOL=grpc
OTEL_EXPORTER_OTLP_ENDPOINT=https://api.honeycomb.io:443
OTEL_EXPORTER_OTLP_HEADERS="x-honeycomb-team=<API-KEY>,x-honeycomb-dataset=auth"
要启用指标,请配置以下变量:
GOTRUE_METRICS_ENABLED - boolean
GOTRUE_METRICS_EXPORTER - string 仅 opentelemetry 和 prometheus
受支持
请确保同时为你的采集器或服务配置 OpenTelemetry Exporter 的配置。
如果你使用 prometheus 导出器,则服务器主机和端口可以通过
以下标准 OpenTelemetry 变量进行配置:
OTEL_EXPORTER_PROMETHEUS_HOST - IP 地址,默认 0.0.0.0
OTEL_EXPORTER_PROMETHEUS_PORT - 端口号,默认 9100
指标在服务器的 / 路径上导出。
如果你使用 opentelemetry 导出器,指标将被推送到
采集器。
例如,如果你使用 Honeycomb.io 则应设置以下标准 OpenTelemetry OTLP 变量:``` OTEL_SERVICE_NAME=auth OTEL_EXPORTER_OTLP_PROTOCOL=grpc OTEL_EXPORTER_OTLP_ENDPOINT=https://api.honeycomb.io:443 OTEL_EXPORTER_OTLP_HEADERS="x-honeycomb-team=,x-honeycomb-dataset=auth"
请注意,Honeycomb.io 需要付费套餐才能摄取指标。
如果您需要调试有关追踪或指标未被推送的问题,可以设置 `DEBUG=true` 以从 OpenTelemetry SDK 获取更多详细信息。
#### 自定义资源属性
使用 OpenTelemetry 追踪或指标导出器时,您可以通过[标准 `OTEL_RESOURCE_ATTRIBUTES` 环境变量](https://opentelemetry.io/docs/reference/specification/resource/sdk/#specifying-resource-information-via-an-environment-variable)定义自定义资源属性。
提供了一个默认属性 `auth.version`,其中包含构建版本。
#### 追踪 HTTP 路由
所有对 Auth API 的 HTTP 调用都会被追踪。路由使用参数化版本,路由参数的值可在 `http.route.params.<route-key>` span 属性中找到。
例如,以下请求:```
GET /admin/users/4acde936-82dc-4552-b851-831fb8ce0927/
将被追踪为:``` http.method = GET http.route = /admin/users/{user_id} http.route.params.user_id = 4acde936-82dc-4552-b851-831fb8ce0927
#### Go 运行时和 HTTP 指标
所有 Go 运行时指标均已暴露。默认情况下还会收集一些 HTTP 指标。
### JSON Web 令牌(JWT)```properties
GOTRUE_JWT_SECRET=supersecretvalue
GOTRUE_JWT_EXP=3600
GOTRUE_JWT_AUD=netlify
JWT_SECRET - string 必需
用于签署 JWT 令牌的密钥。
JWT_EXP - number
令牌的有效时长,以秒为单位。默认为 3600(1 小时)。
JWT_AUD - string
默认的 JWT 受众。使用受众来对用户进行分组。
JWT_ADMIN_GROUP_NAME - string
管理组(如果启用)的名称。默认为 admin。
JWT_DEFAULT_GROUP_NAME - string
分配给所有新用户的默认组。
我们支持 apple、azure、bitbucket、discord、facebook、figma、github、gitlab、google、keycloak、linkedin、notion、snapchat、spotify、slack、twitch、 和 进行外部身份验证。
使用这些名称作为 external 下的键来分别配置每一项。```properties
GOTRUE_EXTERNAL_GITHUB_ENABLED=true
GOTRUE_EXTERNAL_GITHUB_CLIENT_ID=myappclientid
GOTRUE_EXTERNAL_GITHUB_SECRET=clientsecretvaluessssh
GOTRUE_EXTERNAL_GITHUB_REDIRECT_URI=http://localhost:3000/callback
不需要外部提供商,但如果你选择启用任何一项,则必须提供所需的值。
`EXTERNAL_X_ENABLED` - `bool`
该外部提供商是否已启用
`EXTERNAL_X_CLIENT_ID` - `string` **必填**
在外部提供商处注册的 OAuth2 客户端 ID。
`EXTERNAL_X_SECRET` - `string` **必填**
你在注册时由外部提供商提供的 OAuth2 客户端密钥。
`EXTERNAL_X_REDIRECT_URI` - `string` **必填**
OAuth2 提供商将携带 `code` 和 `state` 值重定向到的 URI。
`EXTERNAL_X_URL` - `string`
用于构建授权和访问令牌请求 URL 的基础 URL。供 `gitlab` 和 `keycloak` 使用。对于 `gitlab`,默认为 `https://gitlab.com`。对于 `keycloak`,你需要将其设置为你自己的实例,例如:`https://keycloak.example.com/realms/myrealm`
#### 网络安全加固
配置外部身份验证提供商会导致 Auth 向该提供商的授权、令牌和用户信息端点发起出站 HTTP 请求。通过 `GOTRUE_EXTERNAL_*` 设置或管理 API 配置提供商属于管理操作,这样做意味着你信任将被访问的主机和 URL。
Auth 运行所在的网络应进行加固,以确保这些出站连接无法访问你不希望暴露的仅限内部访问的资源,例如 `localhost`/回环地址或云元数据端点(例如 `169.254.169.254`)。这对于具有管理员可配置或可发现端点的提供商(例如自定义 OAuth/OIDC 提供商)最为重要,因为配置错误或恶意的 URL 可能被用来访问内部基础设施。
#### Apple OAuth
要在本地试用 Apple 外部身份验证,你需要执行以下操作:
1. 在 `/etc/hosts` 配置中将 localhost 重新映射为 \<my_custom_dns \>。
2. 通过将 [api.go](https://github.com/supabase/auth/blob/HEAD/internal/api/api.go) 中的 `ListenAndServe` 替换为以下内容,配置 auth 以通过 localhost 提供 HTTPS 流量: ```
func (a *API) ListenAndServe(hostAndPort string) {
log := logrus.WithField("component", "api")
path, err := os.Getwd()
if err != nil {
log.Println(err)
}
server := &http.Server{
Addr: hostAndPort,
Handler: a.handler,
}
done := make(chan struct{})
defer close(done)
go func() {
waitForTermination(log, done)
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
server.Shutdown(ctx)
}()
if err := server.ListenAndServeTLS("PATH_TO_CRT_FILE", "PATH_TO_KEY_FILE"); err != http.ErrServerClosed {
log.WithError(err).Fatal("http server listen failed")
}
}
发送电子邮件不是必需的,但强烈建议用于密码恢复。 如果启用,则必须提供以下必需的值。```properties GOTRUE_SMTP_HOST=smtp.mandrillapp.com GOTRUE_SMTP_PORT=587 GOTRUE_SMTP_USER=[email protected] GOTRUE_SMTP_PASS=correcthorsebatterystaple GOTRUE_SMTP_ADMIN_EMAIL=[email protected] GOTRUE_MAILER_SUBJECTS_CONFIRMATION="Please confirm"
`SMTP_ADMIN_EMAIL` - `string` **必填**
所有发送邮件的 `From` 邮箱地址。
`SMTP_HOST` - `string` **必填**
用于发送邮件的邮件服务器主机名。
`SMTP_PORT` - `number` **必填**
连接邮件服务器时使用的端口号。
`SMTP_USER` - `string`
如果邮件服务器需要身份验证,则使用此用户名。
`SMTP_PASS` - `string`
如果邮件服务器需要身份验证,则使用此密码。
`SMTP_MAX_FREQUENCY` - `number`
控制再次发送注册确认或密码重置电子邮件之前必须经过的最短时间。该值以秒为单位。默认为 900(15 分钟)。
`SMTP_SENDER_NAME` - `string`
设置发件人名称。如果未使用,默认为 `SMTP_ADMIN_EMAIL`。
`MAILER_AUTOCONFIRM` - `bool`
如果您不需要电子邮件确认,可以将其设置为 `true`。默认为 `false`。
`MAILER_OTP_EXP` - `number`
控制电子邮件链接或 OTP 的有效时长。
`MAILER_URLPATHS_INVITE` - `string`
用户邀请电子邮件中使用的 URL 路径。默认为 `/verify`。
`MAILER_URLPATHS_CONFIRMATION` - `string`
注册确认电子邮件中使用的 URL 路径。默认为 `/verify`。
`MAILER_URLPATHS_RECOVERY` - `string`
密码重置电子邮件中使用的 URL 路径。默认为 `/verify`。
`MAILER_URLPATHS_EMAIL_CHANGE` - `string`
邮箱变更确认电子邮件中使用的 URL 路径。默认为 `/verify`。
`MAILER_SUBJECTS_INVITE` - `string`
用于用户邀请的电子邮件主题。默认为 `You've been invited`。
`MAILER_SUBJECTS_CONFIRMATION` - `string`
用于注册确认的电子邮件主题。默认为 `Confirm your email address`。
`MAILER_SUBJECTS_RECOVERY` - `string`
用于密码重置的电子邮件主题。默认为 `Reset your password`。
`MAILER_SUBJECTS_MAGIC_LINK` - `string`
用于魔法链接电子邮件的主题。默认为 `Your sign-in link`。
`MAILER_SUBJECTS_EMAIL_CHANGE` - `string`
用于邮箱变更确认的电子邮件主题。默认为 `Confirm your new email address`。
`MAILER_SUBJECTS_REAUTHENTICATION` - `string`
用于重新认证的电子邮件主题。默认为 `{{ .Token }} is your verification code`。
`MAILER_SUBJECTS_PASSWORD_CHANGED_NOTIFICATION` - `string`
用于密码已更改通知的电子邮件主题。默认为 `Your password was changed`。
`MAILER_SUBJECTS_EMAIL_CHANGED_NOTIFICATION` - `string`
用于邮箱已更改通知的电子邮件主题。默认为 `Your email address was changed`。
`GOTRUE_MAILER_SUBJECTS_PHONE_CHANGED_NOTIFICATION` - `string`
用于手机号已更改通知的电子邮件主题。默认为 `Your phone number was changed`。
`GOTRUE_MAILER_SUBJECTS_IDENTITY_LINKED_NOTIFICATION` - `string`
用于身份关联通知的电子邮件主题。默认为 `A new sign-in method was linked to your account`。
`GOTRUE_MAILER_SUBJECTS_IDENTITY_UNLINKED_NOTIFICATION` - `string`
用于身份解除关联通知的电子邮件主题。默认为 `A sign-in method was removed from your account`。
`GOTRUE_MAILER_SUBJECTS_MFA_FACTOR_ENROLLED_NOTIFICATION` - `string`
用于验证方式已添加通知的电子邮件主题。默认为 `A new verification method was added to your account`。
`GOTRUE_MAILER_SUBJECTS_MFA_FACTOR_UNENROLLED_NOTIFICATION` - `string`
用于验证方式已移除通知的电子邮件主题。默认为 `A verification method was removed from your account`。
`MAILER_TEMPLATES_INVITE` - `string`
邀请用户时使用的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
可使用 `SiteURL`、`Email` 和 `ConfirmationURL` 变量。
默认内容(如果模板不可用):```html
<h2>You've been invited</h2>
<p>You've been invited to create an account. Follow the link below to accept.</p>
<p><a href="{{ .ConfirmationURL }}">Accept invitation</a></p>
MAILER_TEMPLATES_CONFIRMATION - string
用于确认注册时使用的电子邮件模板的 URL 路径。(例如 https://www.example.com/path-to-email-template.html)
可以使用 SiteURL、Email 和 ConfirmationURL 变量。
默认内容(如果模板不可用):```html
Follow the link below to confirm this email address and finish signing up.
``` ``` `MAILER_TEMPLATES_RECOVERY` - `string`用于重置密码时使用的电子邮件模板的 URL 路径。(例如:https://www.example.com/path-to-email-template.html)
SiteURL、Email 和 ConfirmationURL 变量均可用。
默认内容(如果模板不可用):
<h2>Reset your password</h2>
<p>We received a request to reset your password. Follow the link below to choose a new one.</p>
<p><a href="{{ .ConfirmationURL }}">Reset password</a></p>
<p>If you didn't request this, you can safely ignore this email.</p>
```
`MAILER_TEMPLATES_MAGIC_LINK` - `string`
用于发送魔法链接的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
`SiteURL`、`Email` 和 `ConfirmationURL` 变量可用。
默认内容(如果模板不可用):```html
<h2>Your sign-in link</h2>
<p>Follow the link below to sign in. This link expires shortly and can only be used once.</p>
<p><a href="{{ .ConfirmationURL }}">Sign in</a></p>
```
`MAILER_TEMPLATES_EMAIL_CHANGE` - `string`
用于确认电子邮件地址变更时使用的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
`SiteURL`、`Email`、`NewEmail` 和 `ConfirmationURL` 变量可用。
默认内容(如果模板不可用):```html
<h2>Confirm your new email address</h2>
<p>Follow the link below to confirm {{ .NewEmail }} as your new email address.</p>
<p><a href="{{ .ConfirmationURL }}">Confirm new email address</a></p>
<p>If you didn't request this change, you can safely ignore this email.</p>
```
`MAILER_TEMPLATES_REAUTHENTICATION` - `string`
用于重新认证用户时使用的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
`Token` 变量可用。
默认内容(如果模板不可用):```html
<h2>Your verification code</h2>
<p>Use the code below to verify your identity. It expires shortly.</p>
<p>{{ .Token }}</p>
```
`MAILER_TEMPLATES_PASSWORD_CHANGED_NOTIFICATION` - `string`
用于在通知用户其密码已更改时使用的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
`Email` 变量可用。
默认内容(如果模板不可用):```html
<h2>Your password was changed</h2>
<p>The password for your account was recently changed.</p>
<p>If you didn't make this change, reset your password and contact support immediately.</p>
```
`GOTRUE_MAILER_NOTIFICATIONS_PASSWORD_CHANGED_ENABLED` - `bool`
是否在用户密码更改时发送通知电子邮件。默认为 `false`。
`MAILER_TEMPLATES_EMAIL_CHANGED_NOTIFICATION` - `string`
通知用户其电子邮件已更改时所用的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
`Email` 和 `OldEmail` 变量可用。
默认内容(如果模板不可用):```html
<h2>Your email address was changed</h2>
<p>The email address for your account was changed from {{ .OldEmail }} to {{ .Email }}.</p>
<p>If you didn't make this change, contact support immediately.</p>
```
`GOTRUE_MAILER_NOTIFICATIONS_EMAIL_CHANGED_ENABLED` - `bool`
是否在用户邮箱更改时发送通知邮件。默认为 `false`。
`GOTRUE_MAILER_TEMPLATES_PHONE_CHANGED_NOTIFICATION` - `string`
用于通知用户其电话号码已更改的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
可用的变量有 `Email`、`Phone` 和 `OldPhone`。
默认内容(如果模板不可用):```html
<h2>Your phone number was changed</h2>
<p>The phone number for your account was changed from {{ .OldPhone }} to {{ .Phone }}.</p>
<p>If you didn't make this change, contact support immediately.</p>
```
`GOTRUE_MAILER_NOTIFICATIONS_PHONE_CHANGED_ENABLED` - `bool`
是否在用户的手机号码更改时发送通知电子邮件。默认为 `false`。
`GOTRUE_MAILER_TEMPLATES_IDENTITY_LINKED_NOTIFICATION` - `string`
URL 路径,指向在通知用户其账户已关联登录方式时使用的电子邮件模板。(例如 `https://www.example.com/path-to-email-template.html`)
可以使用 `Email` 和 `Provider` 变量。
默认内容(如果模板不可用):```html
<h2>A new sign-in method was linked</h2>
<p>Your {{ .Provider }} account was linked as a new sign-in method for {{ .Email }}.</p>
<p>If you didn't make this change, contact support immediately.</p>
```
`GOTRUE_MAILER_NOTIFICATIONS_IDENTITY_LINKED_ENABLED` - `bool`
是否在将登录方式关联到用户账户时发送通知邮件。默认为 `false`。
`GOTRUE_MAILER_TEMPLATES_IDENTITY_UNLINKED_NOTIFICATION` - `string`
用于在通知用户其账户已移除某种登录方式时使用的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
`Email` 和 `Provider` 变量可用。
默认内容(如果模板不可用):```html
<h2>A sign-in method was removed</h2>
<p>Your {{ .Provider }} account was removed as a sign-in method for {{ .Email }}.</p>
<p>If you didn't make this change, contact support immediately.</p>
```
`GOTRUE_MAILER_NOTIFICATIONS_IDENTITY_UNLINKED_ENABLED` - `bool`
是否在从用户账户中移除登录方式时发送通知电子邮件。默认为 `false`。
`GOTRUE_MAILER_TEMPLATES_MFA_FACTOR_ENROLLED_NOTIFICATION` - `string`
用于通知用户其账户已添加新的验证方法时使用的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
`Email` 和 `FactorType` 变量可用。
默认内容(如果模板不可用):```html
<h2>A new verification method was added</h2>
<p>Sign-in verification method {{ .FactorType }} was added to your account.</p>
<p>If you didn't make this change, contact support immediately.</p>
```
`GOTRUE_MAILER_NOTIFICATIONS_MFA_FACTOR_ENROLLED_ENABLED` - `bool`
是否在用户账户中添加新的验证方法时发送通知电子邮件。默认为 `false`。
`GOTRUE_MAILER_TEMPLATES_MFA_FACTOR_UNENROLLED_NOTIFICATION` - `string`
用于通知用户其账户中已移除某个验证方法时所使用的电子邮件模板的 URL 路径。(例如 `https://www.example.com/path-to-email-template.html`)
`Email` 和 `FactorType` 变量均可用。
默认内容(如果模板不可用):```html
<h2>A verification method was removed</h2>
<p>Sign-in verification method {{ .FactorType }} was removed from your account.</p>
<p>If you didn't make this change, contact support immediately.</p>
```
`GOTRUE_MAILER_NOTIFICATIONS_MFA_FACTOR_UNENROLLED_ENABLED` - `bool`
是否在从用户账户中移除验证方法时发送通知电子邮件。默认为 `false`。
### Phone Auth
`SMS_AUTOCONFIRM` - `bool`
如果您不需要手机确认,可以将其设置为 `true`。默认为 `false`。
`SMS_MAX_FREQUENCY` - `number`
控制发送另一条短信 OTP 之前必须经过的最短时间。该值为秒数。默认为 60(1 分钟)。
`SMS_OTP_EXP` - `number`
控制短信 OTP 的有效时长。
`SMS_OTP_LENGTH` - `number`
控制发送的短信 OTP 的位数。
`SMS_PROVIDER` - `string`
可用选项有:`twilio`、`messagebird`、`textlocal` 和 `vonage`
然后您可以使用您的 [twilio 凭据](https://www.twilio.com/docs/usage/requests-to-twilio#credentials):
- `SMS_TWILIO_ACCOUNT_SID`
- `SMS_TWILIO_AUTH_TOKEN`
- `SMS_TWILIO_MESSAGE_SERVICE_SID` - 可设置为您的 twilio 发送者手机号码
或者 Messagebird 凭据,可在 [仪表板](https://dashboard.messagebird.com/en/developers/access) 中获取:
- `SMS_MESSAGEBIRD_ACCESS_KEY` - 您的 Messagebird 访问密钥
- `SMS_MESSAGEBIRD_ORIGINATOR` - 短信发送者(您的 Messagebird 电话号码,带 + 或公司名称)
### CAPTCHA
- 如果启用,CAPTCHA 将检查请求体中的 `captcha_token` 字段,并向 CAPTCHA 提供商发出验证请求。
`SECURITY_CAPTCHA_ENABLED` - `string`
是否启用验证码中间件
`SECURITY_CAPTCHA_PROVIDER` - `string`
目前支持的选项仅有:hCaptcha 和 Turnstile
- `SECURITY_CAPTCHA_SECRET` - `string`
- `SECURITY_CAPTCHA_TIMEOUT` - `string`
从 hCaptcha 或 Turnstile 账户获取
### Reauthentication
`SECURITY_UPDATE_PASSWORD_REQUIRE_REAUTHENTICATION` - `bool`
在更新密码时强制重新认证。
### Anonymous Sign-Ins
`GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED` - `bool`
使用此选项启用/禁用匿名登录。
### IP address forwarding
`GOTRUE_SECURITY_SB_FORWARDED_FOR_ENABLED` - `bool`
使用 `Sb-Forwarded-For` HTTP 请求头启用 IP 地址转发。启用后,Auth 将解析此请求头的第一个值作为 IP 地址,并将其用于 IP 地址跟踪和速率限制。在启用此功能之前,请确保此请求头完全可信,仅从可信的客户端或代理传递它。
## Endpoints
Auth 公开以下端点:
### **GET /settings**
返回此 Auth 实例的公开可用设置。```json
{
"external": {
"apple": true,
"azure": true,
"bitbucket": true,
"discord": true,
"facebook": true,
"figma": true,
"github": true,
"gitlab": true,
"google": true,
"keycloak": true,
"linkedin": true,
"notion": true,
"slack": true,
"snapchat": true,
"spotify": true,
"twitch": true,
"twitter": true,
"workos": true
},
"disable_signup": false,
"autoconfirm": false
}
```
### **POST, PUT /admin/users/<user_id>**
根据指定的 `user_id` 创建(POST)或更新(PUT)用户。`ban_duration` 字段接受以下时间单位:"ns"、"us"、"ms"、"s"、"m"、"h"。有关所用格式的更多详细信息,请参阅 [`time.ParseDuration`](https://pkg.go.dev/time#ParseDuration)。```js
headers:
{
"Authorization": "Bearer eyJhbGciOiJI...M3A90LCkxxtX9oNP9KZO" // requires a role claim that can be set in the GOTRUE_JWT_ADMIN_ROLES env var
}
body:
{
"role": "test-user",
"email": "[email protected]",
"phone": "12345678",
"password": "secret", // only if type = signup
"email_confirm": true,
"phone_confirm": true,
"user_metadata": {},
"app_metadata": {},
"ban_duration": "24h" or "none" // to unban a user
}
```
### **POST /admin/generate_link**
根据指定的类型返回相应的邮件操作链接。除此之外,为方便起见,响应还将操作链接的查询参数作为独立的 JSON 字段一并返回(连同用于生成相应令牌的邮件 OTP)。```js
headers:
{
"Authorization": "Bearer eyJhbGciOiJI...M3A90LCkxxtX9oNP9KZO" // admin role required
}
body:
{
"type": "signup" or "magiclink" or "recovery" or "invite" or "email_change_current" or "email_change_new",
"email": "[email protected]",
"password": "secret", // only if type = signup
"data": {
...
}, // only if type = signup
"redirect_to": "https://supabase.io" // Redirect URL to send the user to after an email action. Defaults to SITE_URL.
}
```
返回值```js
{
"action_link": "http://localhost:9999/verify?token=TOKEN&type=TYPE&redirect_to=REDIRECT_URL",
"email_otp": "EMAIL_OTP",
"hashed_token": "TOKEN",
"verification_type": "TYPE",
"redirect_to": "REDIRECT_URL",
...
}
```
### **POST /signup**
使用电子邮件和密码注册新用户。```json
{
"email": "[email protected]",
"password": "secret"
}
```
返回值:```js
{
"id": "11111111-2222-3333-4444-5555555555555",
"email": "[email protected]",
"confirmation_sent_at": "2016-05-15T20:49:40.882805774-07:00",
"created_at": "2016-05-15T19:53:12.368652374-07:00",
"updated_at": "2016-05-15T19:53:12.368652374-07:00"
}
// if sign up is a duplicate then faux data will be returned
// as to not leak information about whether a given email
// has an account with your service or not
```
使用手机号码和密码注册新用户。```js
{
"phone": "12345678", // follows the E.164 format
"password": "secret"
}
```
返回:```js
{
"id": "11111111-2222-3333-4444-5555555555555", // if duplicate sign up, this ID will be faux
"phone": "12345678",
"confirmation_sent_at": "2016-05-15T20:49:40.882805774-07:00",
"created_at": "2016-05-15T19:53:12.368652374-07:00",
"updated_at": "2016-05-15T19:53:12.368652374-07:00"
}
```
如果AUTOCONFIRM已启用且注册是重复的,则端点将返回:```json
{
"code": 400,
"msg": "User already registered"
}
```
### **POST /resend**
允许用户重新发送现有的 signup、sms、email_change 或 phone_change OTP。```json
{
"email": "[email protected]",
"type": "signup"
}
```
[No content provided in the input.]```json
{
"phone": "12345678",
"type": "sms"
}
```
返回值:```json
{
"message_id": "msgid123456"
}
```
### **POST /invite**
通过电子邮件邀请新用户。
此端点需要将 `service_role` 或 `supabase_admin` JWT 设置为 Auth Bearer 请求头:
例如:```js
headers: {
"Authorization" : "Bearer eyJhbGciOiJI...M3A90LCkxxtX9oNP9KZO"
}
```
I received no translatable content in this chunk. The input is empty, so there is nothing to translate.```json
{
"email": "[email protected]"
}
```
Returns:```json
{
"id": "11111111-2222-3333-4444-5555555555555",
"email": "[email protected]",
"confirmation_sent_at": "2016-05-15T20:49:40.882805774-07:00",
"created_at": "2016-05-15T19:53:12.368652374-07:00",
"updated_at": "2016-05-15T19:53:12.368652374-07:00",
"invited_at": "2016-05-15T19:53:12.368652374-07:00"
}
```
### **POST /verify**
验证注册或密码恢复。Type 可以是 `signup`、`recovery`、`invite`、`magiclink`、`email_change`、`sms` 或 `phone_change`,并且 `token` 是从 `/signup` 或 `/recover` 返回的令牌。```json
{
"type": "signup",
"token": "confirmation-code-delivered-in-email"
}
```
如果没有现有密码,`password` 是注册验证所必需的。
返回:```json
{
"access_token": "jwt-token-representing-the-user",
"token_type": "bearer",
"expires_in": 3600,
"refresh_token": "a-refresh-token",
"type": "signup | recovery | invite | magiclink | email_change | sms | phone_change"
}
```
验证电话注册或短信 OTP。类型应设置为 `sms`。```json
{
"type": "sms",
"token": "confirmation-otp-delivered-in-sms",
"redirect_to": "https://supabase.io",
"phone": "phone-number-sms-otp-was-delivered-to"
}
```
返回:```json
{
"access_token": "jwt-token-representing-the-user",
"token_type": "bearer",
"expires_in": 3600,
"refresh_token": "a-refresh-token"
}
```
### **GET /verify**
验证注册或密码恢复。`Type` 可以是 `signup`、`recovery`、`magiclink`、`invite` 或 `email_change`,
`token` 是 `/signup`、`/recover` 或 `/magiclink` 返回的令牌。
查询参数:```json
{
"type": "signup",
"token": "confirmation-code-delivered-in-email",
"redirect_to": "https://supabase.io"
}
```
用户将被登录并重定向到:```
SITE_URL/#access_token=jwt-token-representing-the-user&token_type=bearer&expires_in=3600&refresh_token=a-refresh-token&type=invite
```
你的应用应检测 URL 片段(fragment)中的查询参数,并使用它们来设置会话(supabase-js 会自动执行此操作)
你可以使用 `type` 参数,在 `invite` 或 `recovery` 的情况下将用户重定向到密码设置表单,在 `signup` 的情况下显示账户确认/欢迎消息,或引导他们进入一些额外的入门流程
### **POST /otp**
一次性密码(One-Time-Password)。根据请求体中是否包含 `"email"` 或 `"phone"` 键,向用户发送魔法链接或短信 OTP。
如果 `"create_user": true`,当用户不存在时,不会自动注册该用户。```js
{
"phone": "12345678" // follows the E.164 format
"create_user": true
}
```
或```js
// exactly the same as /magiclink
{
"email": "[email protected]"
"create_user": true
}
```
I notice the input content for this chunk is empty—there is no Markdown text provided between the "INPUT:" marker and "Returns:". Since there is nothing to translate, I will return an empty response.```json
{}
```
### **POST /magiclink** (建议改用 /otp,见上文。)
Magic Link。将向用户发送一个链接(例如:`/verify?type=magiclink&token=fgtyuf68ddqdaDd`),该链接基于
电子邮件地址,用户可用它兑换 access_token。
默认情况下,Magic Links 每 60 秒只能发送一次。```json
{
"email": "[email protected]"
}
```
返回值:```json
{}
```
当点击魔法链接时,它将重定向到 `<SITE_URL>#access_token=x&refresh_token=y&expires_in=z&token_type=bearer&type=magiclink`(参见上面的 `/verify`)
### **POST /recover**
密码恢复。将根据
电子邮件地址向用户发送密码恢复邮件。
默认情况下,恢复链接每 60 秒只能发送一次```json
{
"email": "[email protected]"
}
```
返回:```json
{}
```
### **POST /token**
这是一个 OAuth2 端点,目前实现了
password 和 refresh_token 授权类型
查询参数:```
?grant_type=password
```
body:```js
// Email login
{
"email": "[email protected]",
"password": "somepassword"
}
// Phone login
{
"phone": "12345678",
"password": "somepassword"
}
```
或
查询参数:```
grant_type=refresh_token
```
body:```json
{
"refresh_token": "a-refresh-token"
}
```
获得访问令牌后,您可以通过设置 `Authorization: Bearer YOUR_ACCESS_TOKEN_HERE` 请求头来访问需要认证的方法。
返回值:```json
{
"access_token": "jwt-token-representing-the-user",
"token_type": "bearer",
"expires_in": 3600,
"refresh_token": "a-refresh-token"
}
```
### **GET /user**
获取已登录用户的 JSON 对象(需要身份验证)
返回:```json
{
"id": "11111111-2222-3333-4444-5555555555555",
"email": "[email protected]",
"confirmation_sent_at": "2016-05-15T20:49:40.882805774-07:00",
"created_at": "2016-05-15T19:53:12.368652374-07:00",
"updated_at": "2016-05-15T19:53:12.368652374-07:00"
}
```
### **PUT /user**
更新用户(需要认证)。除了更改电子邮件/密码之外,此方法
还可用于设置自定义用户数据。更改电子邮件将导致发送魔法链接。```json
{
"email": "[email protected]",
"password": "new-password",
"phone": "+123456789",
"data": {
"key": "value",
"number": 10,
"admin": false
}
}
```
返回:```json
{
"id": "11111111-2222-3333-4444-5555555555555",
"email": "[email protected]",
"email_change_sent_at": "2016-05-15T20:49:40.882805774-07:00",
"phone": "+123456789",
"phone_change_sent_at": "2016-05-15T20:49:40.882805774-07:00",
"created_at": "2016-05-15T19:53:12.368652374-07:00",
"updated_at": "2016-05-15T19:53:12.368652374-07:00"
}
```
如果启用了 `GOTRUE_SECURITY_UPDATE_PASSWORD_REQUIRE_REAUTHENTICATION`,用户将需要先重新进行身份验证。```json
{
"password": "new-password",
"nonce": "123456"
}
```
### **GET /reauthenticate**
向用户的邮箱(首选)或手机发送一个 nonce。此端点要求用户首先登录/通过身份验证。用户需要拥有邮箱或手机号码,才能成功发送 nonce。```js
headers: {
"Authorization" : "Bearer eyJhbGciOiJI...M3A90LCkxxtX9oNP9KZO"
}
```
### **POST /logout**
注销用户(需要认证)。
这将撤销该用户的所有刷新令牌。请记住,JWT 令牌在无状态认证中仍然有效,直到过期。
### **GET /authorize**
从外部 OAuth 提供商获取 access_token
查询参数:```
provider=apple | azure | bitbucket | discord | facebook | figma | github | gitlab | google | keycloak | linkedin | notion | slack | snapchat | spotify | twitch | twitter | workos
scopes=<optional additional scopes depending on the provider (email and name are requested by default)>
```
重定向到提供方,然后重定向到 `/callback`
有关 Apple 特有的设置,请参阅:<https://github.com/supabase/auth#apple-oauth>
### **GET /callback**
外部提供方应重定向到此端点
重定向到 `<GOTRUE_SITE_URL>#access_token=<access_token>&refresh_token=<refresh_token>&provider_token=<provider_oauth_token>&expires_in=3600&provider=<provider_name>`
如果请求了额外的 scope,则 `provider_token` 将被填充,你可以使用它来从提供方获取额外数据或与其服务进行交互
twitterworkos