牛牛成长直播app搭建用户中心
牛牛APP登录全流程
当前流程如下
验证码登录过程描述
请求发送验证码
- 查找 sms_codes 记录,是否存在手机号相同且未过期的验证码。如不存在,新建记录;如存在,更新验证码的过期时间。
- 追加相关的设备信息。
- 检查 手机号 与 国家区号 发送次数是否被限制,否则直接返回失败。错误码 403
- 检查腾讯云短信服务是否发送成功,否则直接返回失败。错误码 503
- 发送成功
验证发送的验证码
- 正则匹配 code 是否通过,否则直接返回失败。错误码 403
- 查找 sms_codes 存在未验证的短信验证码,否则直接返回失败。错误码 404
- 通过 手机号 与 国家区号 查找用户,如果查找不到完成自动注册
- 生成 tshn 的 access_token
- 验证成功
OAuth 登录鉴权过程
请求OAuth2授权码
接口地址 | GET /oauth/authorize | |
---|---|---|
请求参数 | client_id | 客户端标识,如 “nnapp-student” |
response_type | 这里按照规范约定值为 “code” | |
redirect_uri | 请求成功后的回调地址,例如 https://example.com/oauth/callback | |
state | 规范中约定的防止 CSRF 的值,通常为随机字符串 | |
请求头 | Authorization | tshn 专用的 access token |
x-user-id | 用户在 tshn 中 userid | |
返回结果 | 重定向到 redirect_uri 参数指定的地址 | 在本例中,会返回重定向请求到 https://example.com/oauth/callback?code=xxxx&state=xx 其中 code 为后续换取 access token 所用的临时验证码 |
换取Access Token
接口地址 | POST /oauth/token | |
---|---|---|
请求参数 | code | 用于换取 access code 的验证码,由上一个接口返回,例如 “xxxx” |
grant_type | 按照规范约定,此处为 “authorization_code” | |
client_id | 用于表明客户端身份的标识,如 “nncz-student” | |
client_secret | 客户端 client_id 对应的密钥 | |
请求头 | Authorization | tshn 专用的 access token |
x-user-id | 用户在 tshn 中 userid | |
返回结果 | 一个 JSON object | { “access_token”: “”, “token_type: “Bearer”, “expires_at”: “unix timestamp”, “role”: “coach”, // “scope”: …, “refresh_token”: … } |
刷新Access Token
接口地址 | POST /oauth/token | |
---|---|---|
请求参数 | refresh_token | refresh_token |
grant_type | 按照规范约定,此处为 “refresh_token” | |
client_id | 用于表明客户端身份的标识,如 “nncz-student” | |
client_secret | 客户端 client_id 对应的密钥 | |
请求头 | Authorization | tshn 专用的 access token |
x-user-id | 用户在 tshn 中 userid | |
返回结果 | 一个 JSON object | { “access_token”: “”, “token_type: “Bearer”, “expires_at”: “unix timestamp”, “role”: “coach”, // “scope”: …, “refresh_token”: … } |
接口定义
SMS 接口
发送验证码
请求路径 | /sms/send |
---|---|
请求方法 | POST |
请求头 | content-type: application/x-www-form-urlencoded |
请求参数 | phone=17671773306&country_code=86&unique_id=xxx&device_id=iPhone13%2C4&mac_address=xxx&ip_address=127.0.0.1 |
返回 | Status=200 {“message”: “发送成功”} |
错误码error | 牛牛APP登录全流程 |
检查验证码
请求路径 | /sms/verify |
---|---|
请求方法 | POST |
请求头 | content-type: application/x-www-form-urlencoded |
请求参数 | phone=17671773306&country_code=86&code=9999 |
返回 | Status=200 {“tshn_access_token”:token,”user_id”:1000000} tshn 用 token(通过 jwt 方式加密),token 的内容包含 { userId: … // 学生 id 从 100 0000 开始 role: … // 可能值为 coach, student exp: … // timestamp iat: ..//timestamp } Status!=200 { “error”: “invalid-code-error”, “error_description”: “验证码没有通过正则匹配” } |
错误码error | 牛牛APP登录全流程 |
错误码
error | message | 描述 |
---|---|---|
100 | action_not_found | 操作的方法不存在 |
403 | send-restricted | 该手机号发送次数受到限制 |
403 | invalid-code-error | 验证码没有通过正则匹配 regex: /^\d{4}$/ |
404 | code-not-found | 没有查询到匹配的验证码 |
500 | find-user-error | 没有查询到该手机号绑定的用户(自动注册功能完成后该错误失效) |
503 | send-fail-error | 短信发送失败了(腾讯云短信服务) |
999 | incomplete_device_info | 没有设备信息 |
OAuth 接口
获取授权
获取 AccessToken
请求业务接口
附录
SMS 相关表结构
sms_code(包含gorm.Model)
属性 | 类型 | 备注 |
---|---|---|
phone | varchar(30) | 手机号,如:131012345678 |
country_code | varchar(10) | 地区号,如 86,与手机号一同构成唯一标识 |
expire_at | timestamp | “2020-01-01 13:05:39”,表示这个 code 的过期时间 |
code | String | 四位数字,例如 9527 |
verified | tinyint | 默认为 0,当通过 /verify API 验证过以后会设置为 1 |
sms_client(包含gorm.Model)
属性 | 类型 | 备注 |
---|---|---|
sms_code_id | int | sms_code_id sms_code的主键 |
device_id | varchar(100) | 设备ID |
mac_address | varchar(100) | 设备网卡的mac地址(ios7之后无法检索出) |
unique_id | varchar(255) | 设备唯一标识 |
ip_address | varchar(50) | 设备网卡分配的ip地址 |
OAuth 相关表结构 (tshn 的数据库中)
oauth_client(包含gorm.Model)
client_id | varchar(255) | 发起对资源请求的客户端标识符,对应 /oauth/authorize 请求中的 client_id。客户端是指 手机端 app,或者小程序,等。 |
---|---|---|
client_secret | varchar(255) | 对应请求中的参数 client_secret |
redirect_uri | varchar(255) | 重定向地址 “https://chat3.nncz.cn/oauth/callback" |
data | json | clientInfo Json存储信息 |
oauth_token(包含gorm.Model)
code | varchar(255) | 授权码 authorization_code |
---|---|---|
access | varchar(255) | access_token |
refresh | varchar(255) | refresh_token |
expire_at | timestamp | refresh过期时间 |
data | json | tokenInfo Json存储信息 |
短信配置
常量名称 | 描述 |
---|---|
secretId | 腾讯云Apikey的id |
secretKey | 腾讯云Apikey的key |
smsAppId | 短信服务的项目appId |
smsSign | 短信签名 |
smsTemplateID | 短信模版id |
登录配置
code | 有效期时长,默认 5分钟 |
---|---|
access_token | 有效期,默认 6 小时 |
refresh_token | 刷新token,默认 30 天 |
参考
- OAuth 2.0 详解
- OAuth 2.0 的四种方式(阮一峰的博客)
- oauth2-server 的开发文档
- RFC 6749
- OAuth Playground
- QCloud API Explorer(短信)