发送短信、邮箱验证码
POST/auth/v1/verification
接口说明
发送短信或邮箱验证码接口,用于向用户的手机号或邮箱发送验证码,支持登录、注册、找回密码等多种场景。
入参要求
必需参数
target: 发送验证码的目标(必填,可选值:ANY、USER)ANY: 不限制,无论用户是否存在都发送USER: 账号必须在系统中存在才发送
可选参数(二选一)
phone_number: 手机号(可选,有效的国内手机号,需加上"+86 "前缀,如"+86 15588665555")email: 邮箱(可选,有效的邮箱地址,格式如abc@example)
请求头参数
x-captcha-token: 验证码token(可选,从验证图片验证码接口获取,接口报错captcha_required时需传入)
前置条件
- 需要在云开发平台开启手机号或邮箱登录功能
- 邮箱登录需配置好SMTP服务器
- 手机号和邮箱不能同时传入,只能选择其一
- 当接口返回captcha_required错误时,需要先完成图片验证码验证
出参说明
成功响应
verification_id: 验证码id(必填,用于后续验证接口)expires_in: 过期时间(必填,单位为秒,默认600秒)is_user: 用户是否存在(可选,true表示已注册,false或空表示未注册)
请求示例
发送邮箱验证码请求示例
{
"email": "user@example",
"target": "ANY"
}
发送手机号验证码请求示例
{
"phone_number": "+86 13800138000",
"target": "ANY"
}
发送验证码给已存在用户请求示例
{
"email": "user@example",
"target": "USER"
}
响应示例
发送成功响应示例
{
"verification_id": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2FwaS5leGFtcGxlLmNvbSIsInN1YiI6Ijk4NzY1NDMyMTAxMjM0NTY3ODkiLCJhdWQiOiJkZW1vLWFwcC0yZjhhOWMzZTFiNGQiLCJleHAiOjE3MzQ2NzU4ODksImlhdCI6MTczNDY2ODY4OSwic2NvcGUiOiJ1c2VyIn0.dGhpc19pc19hX2Zha2Vfc2lnbmF0dXJlX2Zvcl9leGFtcGxlX3B1cnBvc2VzX29ubHlfZG9fbm90X3VzZV9pbl9wcm9kdWN0aW9uX2Vudmlyb25tZW50X3RoaXNfaXNfbm90X3JlYWxfdG9rZW5fZGF0YQ",
"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二选一 | |
| x-captcha-token | string | 否 | 图片验证码token,请求头中传入,接口报错captcha_required时必填 |
响应参数
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| verification_id | string | 是 | 验证码id,用于后续验证接口 |
| expires_in | integer | 是 | 过期时间,单位为秒,默认600秒 |
| is_user | boolean | 否 | 用户是否存在,true表示已注册 |
使用流程
1. 判断是否需要图片验证码
- 首次发送可直接调用
- 如果返回captcha_required错误,需要先完成图片验证码验证
2. 发送验证码
- 调用本接口发送验证码
- 根据场景选择target参数
- 传入手机号或邮箱
3. 用户接收验证码
- 用户在手机或邮箱中接收验证码
- 验证码有效期为600秒(10分钟)
4. 验证验证码
- 调用验证短信、邮箱验证码接口
- 传入verification_id和用户输入的验证码
- 获取verification_token
5. 后续操作
- 如果is_user为true,使用verification_token调用登录接口
- 如果is_user为false或空,使用verification_token调用注册接口
关键特性
验证码特性
- 验证码长度为6位数字
- 有效期为600秒(10分钟)
- 同一手机号或邮箱60秒内只能发送一次
- 验证码使用后立即失效
安全性
- 限制发送频率,防止短信轰炸
- 支持图片验证码防护
- 记录发送日志
使用场景
登录场景(target=ANY)
- 用户使用手机号或邮箱登录
- 不限制用户是否存在
- 适用于登录或注册流程
找回密码场景(target=USER)
- 用户忘记密码
- 必须是已注册用户
- 防止泄露用户信息
注册场景(target=ANY)
- 用户注册新账号
- 必须是未注册用户
- 防止重复注册
注意事项
手机号格式
- 必须加上"+86 "前缀
- 格式示例:"+86 13800138000"
- 不支持其他国家手机号
邮箱格式
- 必须是有效的邮箱地址
- 格式示例:"user@example"
- 支持常见邮箱服务商
发送频率限制
- 同一手机号或邮箱60秒内只能发送一次
- 同一IP每小时最多发送10次
- 超过限制需等待后重试
图片验证码
- 当检测到异常发送行为时要求图片验证码
- 需要先调用图片验证码接口完成验证
- 获取captcha_token后在请求头中传入
错误处理策略
- 友好的错误提示信息
- 自动处理图片验证码流程
- 实现发送倒计时
- 记录错误日志
相关接口
- 验证短信、邮箱验证码 - 验证验证码
- 验证图片验证码 - 获取captcha_token
- 获取图片验证码 - 获取图片验证码
- 用户登录 - 使用verification_token登录
- 用户注册 - 使用verification_token注册
Request
Header Parameters
x-captcha-token string
验证码token,从验证图片验证码接口获取,接口报错captcha_required时需传入
- application/json
Body
phone_number 手机号 (string)
有效的国内手机号,需加上"+86 "前缀,如"+86 15588665555"
email 邮箱 (string)
有效的邮箱,格式abc@xxx
target 发送验证码的目标 (string)required
传入ANY,其余可选值USER(账号必须在系统中存在)
Responses
- 200
Response Headers
- application/json
- Schema
- Example (from schema)
- Example
Schema
verification_id 验证码id (string)
用于传入验证短信、邮箱验证码/auth/v1/verification/verify接口进行验证码的验证
expires_in 验证码过期时间,单位为秒 (integer)
is_user 用户是否存在 (boolean)
判断这个手机号或邮箱是否已经注册为用户,已注册返回true
{
"verification_id": "string",
"expires_in": 0,
"is_user": true
}
{
"verification_id": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2FwaS5leGFtcGxlLmNvbSIsInN1YiI6Ijk4NzY1NDMyMTAxMjM0NTY3ODkiLCJhdWQiOiJkZW1vLWFwcC0yZjhhOWMzZTFiNGQiLCJleHAiOjE3MzQ2NzU4ODksImlhdCI6MTczNDY2ODY4OSwic2NvcGUiOiJ1c2VyIn0.dGhpc19pc19hX2Zha2Vfc2lnbmF0dXJlX2Zvcl9leGFtcGxlX3B1cnBvc2VzX29ubHlfZG9fbm90X3VzZV9pbl9wcm9kdWN0aW9uX2Vudmlyb25tZW50X3RoaXNfaXNfbm90X3JlYWxfdG9rZW5fZGF0YQ",
"expires_in": 600
}
Loading...