牛牛App登陆过程

牛牛成长直播app搭建用户中心

牛牛APP登录全流程

当前流程如下

image-20210317113919021

验证码登录过程描述

请求发送验证码

  1. 查找 sms_codes 记录,是否存在手机号相同且未过期的验证码。如不存在,新建记录;如存在,更新验证码的过期时间。
  2. 追加相关的设备信息。
  3. 检查 手机号国家区号 发送次数是否被限制,否则直接返回失败。错误码 403
  4. 检查腾讯云短信服务是否发送成功,否则直接返回失败。错误码 503
  5. 发送成功

验证发送的验证码

  1. 正则匹配 code 是否通过,否则直接返回失败。错误码 403
  2. 查找 sms_codes 存在未验证的短信验证码,否则直接返回失败。错误码 404
  3. 通过 手机号国家区号 查找用户,如果查找不到完成自动注册
  4. 生成 tshn 的 access_token
  5. 验证成功

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登录全流程

错误码

errormessage描述
100action_not_found操作的方法不存在
403send-restricted该手机号发送次数受到限制
403invalid-code-error验证码没有通过正则匹配 regex: /^\d{4}$/
404code-not-found没有查询到匹配的验证码
500find-user-error没有查询到该手机号绑定的用户(自动注册功能完成后该错误失效)
503send-fail-error短信发送失败了(腾讯云短信服务)
999incomplete_device_info没有设备信息

OAuth 接口

获取授权

获取 AccessToken

请求业务接口

附录

SMS 相关表结构

sms_code(包含gorm.Model)

属性类型备注
phonevarchar(30)手机号,如:131012345678
country_codevarchar(10)地区号,如 86,与手机号一同构成唯一标识
expire_attimestamp“2020-01-01 13:05:39”,表示这个 code 的过期时间
codeString四位数字,例如 9527
verifiedtinyint默认为 0,当通过 /verify API 验证过以后会设置为 1

sms_client(包含gorm.Model)

属性类型备注
sms_code_idintsms_code_id sms_code的主键
device_idvarchar(100)设备ID
mac_addressvarchar(100)设备网卡的mac地址(ios7之后无法检索出)
unique_idvarchar(255)设备唯一标识
ip_addressvarchar(50)设备网卡分配的ip地址

image-20210317114229778

OAuth 相关表结构 (tshn 的数据库中)

oauth_client(包含gorm.Model)

client_idvarchar(255)发起对资源请求的客户端标识符,对应 /oauth/authorize 请求中的 client_id。客户端是指 手机端 app,或者小程序,等。
client_secretvarchar(255)对应请求中的参数 client_secret
redirect_urivarchar(255)重定向地址 “https://chat3.nncz.cn/oauth/callback”
datajsonclientInfo Json存储信息

oauth_token(包含gorm.Model)

codevarchar(255)授权码 authorization_code
accessvarchar(255)access_token
refreshvarchar(255)refresh_token
expire_attimestamprefresh过期时间
datajsontokenInfo Json存储信息

短信配置

常量名称描述
secretId腾讯云Apikey的id
secretKey腾讯云Apikey的key
smsAppId短信服务的项目appId
smsSign短信签名
smsTemplateID短信模版id

登录配置

code有效期时长,默认 5分钟
access_token有效期,默认 6 小时
refresh_token刷新token,默认 30 天

参考

  1. OAuth 2.0 详解
  2. OAuth 2.0 的四种方式(阮一峰的博客)
  3. oauth2-server 的开发文档
  4. RFC 6749
  5. OAuth Playground
  6. QCloud API Explorer(短信)