DieselChen

个人博客,记录一下学习的点滴~

0%

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

错误码

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地址

image-20210317114229778

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 天

参考

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

欢迎关注我的其它发布渠道

-----------本文结束感谢您的阅读-----------