20190403 syllabus-backend学习
流程图
image.pngsyllabus-backend后台框架实现了上述画圈的内容
查询认证配置并返回
由controller.user.oauth.getOauthData
来实现
由于返回给web端和app端的认证配置内容不同,所以需要先判断请求来源from
(默认请求来源为web)
将from
作为参数传递给service.user.oauth.generateOauthData(from)
方法,该方法根据请求来源的不同,生成并返回不同的认证配置
其中若请求来源为iOS、android、mini,则返回state
(将被存储在session中,用于oauth重定向到后台时的state校对),client_id
,redirect_uri
(业务后台的uri),oauth_url
,scope
code换取token
使用redirect_url,传入code和state,调用controller.user.oauth.stuLogin
,流程如下:
- 检验state的合法性
判断传入的state和之前存在session中的state是否一致 - code换取accessToken
构建data,固定grant_type为'authorization_code',确定为授权码模式登录,根据不同的appType生成不同的data
let data = {
grant_type: 'authorization_code',
code: code,
client_id: config.stu_oauth[appType].client_id,
client_secret: config.stu_oauth[appType].client_secret
}
向oauth后台发送post请求,传递data,如果请求成功则更新STU token,返回res.data
- 生成课程表登录凭证
根据分别设定的skey、refreshKey过期时间,生成新的skeyExpiresAt
,refreshKeyExpiresAt
,将skey
,refreshKey
,skeyKeyExpiresAt
,refreshKeyExpiresAt
组装到loginKeys
中,将新数据增加到对应的数据库中,返回登录凭证
用refreshKey刷新登录凭证并更新信息
refreshLoginState
方法用refresh_key来刷新课程表登录凭证,并更新用户信息
刷新凭证
首先查询refresh_key所在的密钥表,获取密钥,检查密钥是否存在,判断登录态是否有效
若refresh_key过期则抛出错误,如果没有过期就重新生成课程表登录凭证
更新用户信息
调用service.user.oauth.getStuToken(user_id)
用user_id在数据库中查询对应的token,判断是否有效,由于需要预留给服务器计算和通信的时间,所以规定过期时间前60s为有效
如果token有效,则返回token,设置is_refresh:false
如果token不存在或过期,则请求刷新token,设置grant_type
为refresh_token,返回刷新后的token,并设置is_refresh:true
判断!is_refresh
,当token有效,不用刷新时,需要同步并保存用户信息
返回用户信息
调用service.user.user.filtrateUserInfo()
方法,过滤用户信息,仅返回id,nickName以及avatarUrl