小程序登录架构
总体流程
一、打开小程序后,要生成一个uuid,首先检测登录状态
此处属于小程序内部处理逻辑,通过判断access_token及refresh_token是否过期来完成。
具体请参考《基于Token机制鉴权架构》
注:每个客户端都要存在一个唯一的uuid,也可以在打开小程序时处理
二、判断登录状态
如果已经登录,则不做处理
如果未登录,则尝试自动登录
三、自动登录
1、获取unionId
首先从缓存中获取unionid,如获取到则进行如下第3步骤。
未获取到再从数据库中通过uuid获取unionId。
2、如上步骤未获取到unionId,则需要从微信jscode2session接口获取unionId。
如返回unionId,则进行如下第3步骤。
如未返回unionId,则记录sessionKey,返回前端,前端调用wx.getUserInfo拿到加密数据,然后传递给解密api,解密api会解码出unionid并和uuid绑定。解密流程参照如下第4步骤。
3、如可以获取到unionId,则进行绑定状态的判定
如已绑定,则登录返回商城token信息,小程序记录token即可。
如未绑定,缓存中和数据库中要存储对应的授权信息即unionId,返回前端account_not_found,前端需要登录或者注册进行账号的绑定。
具体请参考如下《自动登录API架构》
4、将解密后的auth2token记录缓存
校验数据库中是否存在账号绑定信息
存在:执行登录返回商城令牌token信息。
不存在:在数据库中将uuid和unionId进行绑定。
具体参考如下《解密API架构》
自动登录api架构
一、小程序调用wx.login获取code
二、调用自动登录api
此时要传递code 参数,服务器端要请求微信api来获取session_key和UnionID,
此时如果微信返回了UnionID ,则要使用unionid做为绑定的凭证
在请求此api时,需要appid和appsecret,这两个参数要在服务器端配置(要做一个小程序自动登录配置选项)
还要传递uuid参数,当用unionid查找不到账户时,需要将此uuid做为Key将unionid存储在redis,并返回
在登录绑定时会用此uuid再取出unionid进行绑定
如果自动登录成功(找到相应账号)返回token,如果自动登录失败(没有找到相应账号)提示绑定失败
如果没有读到unionid则要明确返回值给前端
三、入参:
1、code
2、uuid
四、返回值
没有读到unionid:
{
"autologin":"fail",
"reson":"unionid_not_found"
}
读到了unionid,但没有找到账号
{
"autologin":"fail",
"reson":"account_not_found"
}
自动登录成功:
正常登录的返回token一样的
登录绑定流程
- 小程序发起登录绑定
- 调用登录绑定API,首先获取unionId
从缓存中获取,获取到则进行登录绑定。反之根据uuid从数据库获取unionId。
从数据库中获取,根据uuid从数据库进行获取unionId,获取到则进行登录绑定,反之调用执行登录注册操作,不进行绑定。
- 如果从缓存中获取到unionId,需要根据uuid和unionId查询绑定信息,如果查询到记录则更新绑定信息,如果未查询到则新增绑定信息。
- 如果从数据库中获取到绑定信息则需要更新此账号绑定信息。
- 登录成功后跳转首页
解密api架构
一、入参
1、encrypted_data
2、code
3、uuid
4、iv
二、处理逻辑
根据解密算法文档对encrypted_data进行解密,得到unionid
按自动登录的逻辑处理unionid
三、返回值:
没有找到账号
{
"autologin":"fail",
"reson":"account_not_found"
}
自动登录成功:
正常登录的返回token一样的
Token失效更换令牌
一、入参
1、uuid
二、逻辑处理
通过前端入参uuid到数据库es_connect查询是否存在绑定关系,
存在,获取令牌返回商城token
不存在,返回如下
{
"login":"fail",
"reson":"account_not_found"
}
前端进行退出操作,
小程序退出账号
小程序退出账号不进行账号解绑,清除商城toekn即可
效果
小程序退出登录后到首页,重新登录或者注册则绑定登录或者注册的新账号。
退出小程序后,再次进入小程序则进行自动登录,用户无感。