发送短信、邮箱验证码
POST/auth/v1/verification
接口说明
发送短信或邮箱验证码接口,用于向用户的手机号或邮箱发送验证码,支持登录、注册、找回密码等多种场景。
本接口支持两种模式:
- 验证码模式(默认):发送6位数字验证码到用户手机或邮箱,用户需手动输入验证码完成验证。
- Magic Link 模式:当请求体中传入
email_redirect_to参数时启用,仅支持邮箱(email参数),不支持手机号。此时邮件正文由邮箱身份源的邮件模板渲染,服务端会把本次生成的一次性登录链接注入模板变量{{.ConfirmationURL}},用户点击该链接即可完成登录/注册并跳转到email_redirect_to指定的页面。因此该模式必须配合包含{{.ConfirmationURL}}变量的邮件模板使用,详见 Magic Link 邮件模板配置。
入参要求
必需参数
target: 发送验证码的目标(必填,可选值:ANY、USER)ANY: 不限制,无论用户是否存在都发送USER: 账号必须在系统中存在才发送
可选参数(二选一)
phone_number: 手机号(可选,有效的国内手机号,需加上"+86 "前缀,如"+86 15588665555")email: 邮箱(可选,有效的邮箱地址,格式如abc@example)
Magic Link 专用参数
email_redirect_to: 跳转URL(可选,string 类型)。登录成功后跳转的目标页面地址。传入此参数即触发 Magic Link 模式,邮件内容从验证码文本变为由邮件模板渲染的登录链接邮件。- 必须传入完整 URL,如
https://envId-appid.tcloudbaseapp.com/dashboard - 仅在传入
email参数时生效,不支持与phone_number搭配使用 - 传入后服务端会渲染邮件模板中的
{{.ConfirmationURL}}变量,模板中未包含该变量时,用户收到的邮件里不会出现登录链接
- 必须传入完整 URL,如
请求头参数
x-captcha-token: 验证码token(可选,从验证图片验证码接口获取,接口报错captcha_required时需传入)
前置条件
- 需要在云开发平台开启手机号或邮箱登录功能
- 手机号和邮箱不能同时传入,只能选择其一
- 当接口返回captcha_required错误时,需要先完成图片验证码验证
- Magic Link 模式额外要求:
- 邮箱身份源的邮件模板中必须包含
{{.ConfirmationURL}}变量,否则邮件中不会出现登录链接,详见 Magic Link 邮件模板配置 email_redirect_to中的域名需为已配置的自定义域名或 CloudBase 默认域名,否则用户点击链接后可能返回404
- 邮箱身份源的邮件模板中必须包含
Magic Link 邮件模板配置
Magic Link 模式不会发送固定格式的邮件,而是复用邮箱身份源的邮件模板:服务端渲染模板时,会把本次生成的一次性登录链接写入模板变量 {{.ConfirmationURL}}。因此使用 Magic Link 前需先完成模板配置。
模板变量
| 变量 | 适用模式 | 说明 |
|---|---|---|
{{.ConfirmationURL}} | Magic Link 模式 | 一次性登录链接。用户点击后由云开发认证服务完成校验,并跳转到 email_redirect_to 指定的页面 |
{{.VerificationCode}} | 验证码模式 | 6 位数字验证码 |
{{.Email}} | 两种模式 | 收件人邮箱 |
{{.ExpireMinutes}} | 两种模式 | 有效期,单位为分钟 |
{{.Usage}} | 两种模式 | 用途说明 |
模板示例
<h1>登录确认</h1>
<p>你好,{{.Email}},请点击下方按钮完成登录:</p>
<p>
<a
href="{{.ConfirmationURL}}"
style="display:inline-block;padding:10px 20px;background:#0052d9;color:#ffffff;text-decoration:none;border-radius:4px;"
>
确认邮箱并登录
</a>
</p>
<p>链接 {{.ExpireMinutes}} 分钟内有效,且仅可使用一次。</p>
配置方式
前往 云开发平台/身份认证/登录方式 ,在「邮箱验证码」卡片中配置邮件模板。
注意
邮件模板中未包含 {{.ConfirmationURL}} 变量时,本接口仍会返回成功,但用户收到的邮件中不会出现登录链接,Magic Link 无法完成登录。
出参说明
验证码模式(未传 email_redirect_to)成功响应
verification_id: 验证码id(必填,用于后续验证接口)expires_in: 过期时间(必填,单位为秒,默认600秒)is_user: 用户是否存在(可选,true表示已注册,false或空表示未注册)
Magic Link 模式(传入 email_redirect_to)成功响应
expires_in: 过期时间(必填,单位为秒,默认600秒)is_user: 用户是否存在(可选,true表示已注册,false或空表示未注册)
Magic Link 模式下一次性登录链接已通过邮件模板的 {{.ConfirmationURL}} 变量嵌入邮件中,用户无需手动验证,响应中不包含 verification_id 字段。
请求示例
发送邮箱验证码请求示例(验证码模式)
{
"email": "user@example.com",
"target": "ANY"
}
发送手机号验证码请求示例(验证码模式)
{
"phone_number": "+86 13800138000",
"target": "ANY"
}
发送验证码给已存在用户请求示例(验证码模式)
{
"email": "user@example.com",
"target": "USER"
}
发送 Magic Link 邮件请求示例(Magic Link 模式)
{
"email": "user@example.com",
"target": "ANY",
"email_redirect_to": "https://envId-appid.tcloudbaseapp.com/dashboard"
}
响应示例
验证码模式 - 发送成功响应示例
{
"verification_id": "your_access_token",
"expires_in": 600,
"is_user": true
}
Magic Link 模式 - 发送成功响应示例
{
"expires_in": 600,
"is_user": true
}
需要图片验证码响应示例
{
"error": "captcha_required",
"error_code": 4028,
"error_description": "需要完成图片验证码验证"
}
手机号格式错误响应示例
{
"error": "invalid_phone_number",
"error_code": 4001,
"error_description": "手机号格式错误,需加上+86前缀"
}
用户不存在响应示例
{
"error": "user_not_found",
"error_code": 4004,
"error_description": "用户不存在"
}
发送频率过高响应示例
{
"error": "rate_limit_exceeded",
"error_code": 4029,
"error_description": "发送验证码频率过高,请60秒后重试"
}
字段说明
请求参数
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| target | string | 是 | 发送目标,可选值:ANY(不限制)、USER(用户必须存在) |
| phone_number | string | 否 | 手机号,格式为"+86 手机号",与email二选一 |
| string | 否 | 邮箱地址,与phone_number二选一 | |
| email_redirect_to | string | 否 | 跳转URL。传入此参数触发 Magic Link 模式,服务端将一次性登录链接渲染到邮件模板的 {{.ConfirmationURL}} 变量。必须传入完整URL。仅与 email 参数搭配使用 |
| x-captcha-token | string | 否 | 图片验证码token,请求头中传入,接口报错captcha_required时必填 |
响应参数(验证码模式 - 未传 email_redirect_to)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| verification_id | string | 是 | 验证码id,用于后续验证接口 |
| expires_in | integer | 是 | 过期时间,单位为秒,默认600秒 |
| is_user | boolean | 否 | 用户是否存在,true表示已注册 |
响应参数(Magic Link 模式 - 传入 email_redirect_to)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| expires_in | integer | 是 | 过期时间,单位为秒,默认600秒 |
| is_user | boolean | 否 | 用户是否存在,true表示已注册 |
使用流程
流程一:验证码模式(默认,未传 email_redirect_to)
1. 判断是否需要图片验证码
- 首次发送可直接调用
- 如果返回captcha_required错误,需要先完成图片验证码验证
2. 发送验证码
- 调用本接口发送验证码
- 根据场景选择target参数
- 传入手机号或邮箱
3. 用户接收验证码
- 用户在手机或邮箱中接收验证码
- 验证码有效期为600秒(10分钟)
4. 验证验证码
- 调用验证短信、邮箱验证码接口
- 传入verification_id和用户输入的验证码
- 获取verification_token
5. 后续操作
- 如果is_user为true,使用verification_token调用登录接口
- 如果is_user为false或空,使用verification_token调用注册接口
流程二:Magic Link 模式(传入 email_redirect_to)
1. 配置邮件模板
- 在邮箱身份源的邮件模板中加入
{{.ConfirmationURL}}变量,详见 Magic Link邮件模板配置 - 模板为一次性配置,配置完成后所有 Magic Link 邮件都会使用该模板渲染
2. 前端调用发送接口
- 调用本接口,请求体中传入
email和email_redirect_to参数 - 后端检测到
email_redirect_to后自动切换为 Magic Link 模式,并把一次性登录链接渲染到模板的{{.ConfirmationURL}}位置
3. 用户收到邮件并点击链接
- 用户收到按模板渲染的邮件,点击其中的登录链接
- 云开发认证服务校验链接中的一次性凭证,完成登录/注册,并跳转到
email_redirect_to指定的目标页面 - 用户到达目标页面时已处于登录状态,可直接使用应用
关键特性
验证码特性
- 验证码长度为6位数字
- 有效期为600秒(10分钟)
- 同一手机号或邮箱60秒内只能发送一次
- 验证码使用后立即失效
安全性
- 限制发送频率,防止短信轰炸
- 支持图片验证码防护
- 记录发送日志
使用场景
场景一:验证码登录(target=ANY,不传 email_redirect_to)
- 用户使用手机号或邮箱登录
- 不限制用户是否存在
- 适用于登录或注册流程
场景二:找回密码(target=USER,不传 email_redirect_to)
- 用户忘记密码
- 必须是已注册用户
- 防止泄露用户信息
场景三:注册验证(target=ANY,不传 email_redirect_to)
- 用户注册新账号
- 必须是未注册用户
- 防止重复注册
场景四:Magic Link 一键登录(target=ANY,传入 email_redirect_to)
- 用户通过邮箱进行一键登录,无需手动输入验证码
- 邮件按配置的邮件模板渲染,模板中的
{{.ConfirmationURL}}即登录链接,点击即完成登录并跳转到指定页面 - 如果用户未注册,点击链接后将自动完成注册并登录
Magic Link 场景示例:SaaS 应用邀请登录
- SaaS 应用向用户邮箱发送 Magic Link,
email_redirect_to设为应用的 Dashboard 页面 - 用户收到邮件,点击模板中由
{{.ConfirmationURL}}渲染出的登录链接 - 浏览器自动完成登录,跳转到 Dashboard 页面
// 请求示例
{
"email": "invitee@company.com",
"target": "ANY",
"email_redirect_to": "https://envId-appid.tcloudbaseapp.com/dashboard?from=invite"
}
// 响应示例
{
"expires_in": 600,
"is_user": false
}
Magic Link 场景示例:内容订阅邮件中嵌入登录
- 内容平台向订阅者发送 Magic Link,
email_redirect_to设为某篇文章页面 - 用户在邮箱中收到邮件,点击链接
- 自动登录并跳转到文章页面,直接阅读
// 请求示例
{
"email": "reader@example.com",
"target": "USER",
"email_redirect_to": "https://envId-appid.tcloudbaseapp.com/articles/12345"
}
注意事项
手机号格式
- 必须加上"+86 "前缀
- 格式示例:"+86 13800138000"
- 不支持其他国家手机号
邮箱格式
- 必须是有效的邮箱地址
- 格式示例:"user@example.com"
- 支持常见邮箱服务商
发送频率限制
- 同一手机号或邮箱60秒内只能发送一次
- 同一IP每小时最多发送10次
- 超过限制需等待后重试
图片验证码
- 当检测到异常发送行为时要求图片验证码
- 需要先调用图片验证码接口完成验证
- 获取captcha_token后在请求头中传入
email_redirect_to 参数规则(Magic Link 模式)
email_redirect_to仅在传入email参数时生效,不支持phone_number- 必须传入完整 URL(如
https://envId-appid.tcloudbaseapp.com/dashboard),不支持相对路径 email_redirect_to中的域名需为已配置的自定义域名或 CloudBase 默认域名,否则用户点击链接时可能返回404- 邮件正文由邮件模板渲染,模板中必须包含
{{.ConfirmationURL}}变量,否则邮件中不会出现登录链接 - Magic Link 有效期与验证码一致,为600秒(10分钟),过期后链接失效
- 验证码一次性使用,点击链接完成登录后链接即失效,不可重复使用
Magic Link 安全性
- 邮件中的链接强制使用 HTTPS 协议
- Token 不会出现在 URL 中
- 登录完成后 URL 中的验证参数会被自动清除
错误处理策略
- 友好的错误提示信息
- 自动处理图片验证码流程
- 实现发送倒计时
- 记录错误日志
相关接口
- 验证短信、邮箱验证码 - 验证验证码
- 验证图片验证码 - 获取captcha_token
- 获取图片验证码 - 获取图片验证码
- 用户登录 - 使用verification_token登录
- 用户注册 - 使用verification_token注册
- 邮件模板配置 - 配置 Magic Link 邮件模板
Request
Responses
- 200