登录流程
实现小程序用户登录流程,大致分为以下几个步骤
- 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
- 调用 auth.code2Session 接口,换取用户唯一标识 OpenID 和会话密钥 session_key。自定义登录状态关联openid和session_key,返回自定义登录状态
- 前端缓存自定义状态到storage,wx.request()携带自定义登录状态请求数据
- 开发者服务器通过自定义登录状态查询openid和session_key,验证通过返回业务数据
接下来仔细讲讲实现过程
1 获取临时code
通过调用wx.login(),获取登录凭证,有效期为5分钟
wx.login({ success (res) { console.log(res.code) } })
复制
2 调用 auth.code2Session 接口,换取用户唯一标识
此步骤需要在服务端完成,get方式请求
https://api.weixin.qq.com/sns/jscode2session? appid=APPID& // 小程序 appId secret=SECRET& // 小程序 appSecret js_code=JSCODE& // 登录时获取的 code grant_type=authorization_code // 授权类型,此处只需填写 authorization_code 返回值
复制
返回JSON数据包,包含openid、session_key等。创建自定义登录状态,与openid、session_key关联,存到数据库。并把自定义登录状态返回前端。
注意:这里强调下,session_key是有时效的,但是后台无法验证,需要前端验证。且微信官方不建议直接返回openid给前端。
3 缓存自定义登录状态,请求业务数据带上自定义登录状态
上面说到session_key是有时效的,如果我们调用微信接口(如服务端获取用户开放数据),一定要保证session_key在有效期内。所以在请求前要验证登录状态是否过期
wx.checkSession({ success () { //session_key 未过期,并且在本生命周期一直有效 }, fail () { // session_key 已经失效,需要重新执行登录流程 wx.login() //重新登录 } })
复制
4 验证并返回业务数据
这里的验证不是说验证session_key是否在有效期内,而是验证是否存在session_key和openid,微信官方未提供服务端验证方法,也不会把 session_key 的有效期告知开发者,下面就是官方对会话密钥 session_key 有效性的解释
这里我个人觉得,如果是自有业务的接口,session_key不是很重要,也可以说不需要,session_key是否有效,对自有业务影响不大,就比如拿我们现在项目来说,查询用户数据列表,直接在开发者服务器数据库获取,我只要验证这个用户是否存在即可。而什么时候需要验证session_key是否有效呢,比如我需要根据session_key来解析用户敏感数据,这个时候session_key必须有效,否则拿不到数据。