浅析微信小程序登录与授权
发表时间:2020-10-10
发布人:葵宇科技
浏览次数:64
浅析微信小程序登录与授权
很多人会把微信小程序的登录和授权搞混淆。
微信小程序登录
其实微信小程序的登录作用就跟传统的帐号密码登录一样,只是不用用户手工输入帐号密码。
小程序登录过程分两部分交互:
- 小程序向开发者服务器请求登录
code ===> token(自定义登录态)
- 开发者服务器向微信接口服务器请求登录
appid + appsecret + code ===> openid + session_key
我们可以把调用wx.login()返回的code当成传统登录的帐号。
而密码呢,则是由开发者服务器与微信接口服务器验证这一步替代。
返回的自定义登录态就是传统登录的token了。
code:登录凭证(帐号)由wx.login()获得
appid + appsecret:相当于密码
session_key:微信接口返回的token
openid:用户标识,相当于帐号
自定义登录态:开发者服务生成并发送给小程序端的token,用于标识用户是否已经登录并在每个交互请求中携带,用于开发者服务器识别用户。
以下为微信官方帮助的登录流程图:
这里大家可能会有几个问题
-
session_key有什么用?
session_key用于解密返回的加密数据
- wx.getUserInfo()
- 获取用户手机号码
-
session_key的有效期是多长?
通过 wx.login 接口获得的用户登录态拥有一定的时效性。
用户越久未使用小程序,用户登录态越有可能失效。
反之如果用户一直在使用小程序,则用户登录态一直保持有效。
具体时效逻辑由微信维护,对开发者透明。
调用wx.login(),会让之前的session_key失效,因此每次调用wx.login()后都要把code发送到服务器端更新session_key
-
自定义登录态应该怎么设置有效期?
自定义登录态其实跟session_key没什么关系,有效期的设置就跟传统的session那样设置就可以。
-
什么时候调用wx.login()?
因为调用wx.login()的目的是获取code,从而更新服务器的session_key,所以当session_key登录态失效时调用。
-
什么时候调用wx.checkSession()?
因为wx.checkSession()的作用是检查登录态(session_key)是否失效,所以结合1,4两点,在以下情况下应该调用wx.checkSession()
- 在获取用户信息或用户手机号码之前
- 在其他的服务器需要使用到session_key进行解密数据的情况下
-
如何处理小程序登录流程?(以下token为自定义登录态)
- 用户未登陆(本地无token)、token失效或微信登录态失效
- 调用wx.login()获取code,发送到开发服务器
- 开发服务器使用appid + appsecret + code 向微信接口服务器获取openid+session_key
- 开发服务器生成token,并建立token、openid、session_key的关联
- 开发服务器返回token给小程序端,小程序端保存toke到本地缓存(storage,数据库等)
-
如何处理检查登录态流程?
- 有加密数据要发送到服务器进行解密操作,如获取用户信息,获取用户手机号码等
- 调用wx.checkSession()
- 如果登录态有效,转5
- 如果登录态失效,调用wx.login()走小程序登录流程,登陆成功后转5
- 发起服务器请求发送加密数据给服务器解密
-
常见处理流程
以下请求都带本地保存的token
-
不需登录的请求
- 直接请求
-
需要登录的请求
- 直接请求,返回未登录状态
- 执行小程序登录流程,保存本地token
- 重新请求
-
需要处理解密数据的请求
这里有两种处理方式(建议使用第一种):
- 一进入页面就进行用户登录状态和微信登录态的检查
- 用户操作getUserInfo,getPhoneNumber等操作的回调函数中做用户登录状态和微信登录态的检查
处理方式一
- 检查是否登录
- 未登录(本地token为空或接口返回token失效)则执行小程序登录流程,本地保存最新token【这时微信登录态是有效的,因为这过程重新获取了session_key】
- 已登录(本地token不为空且接口返回token未失效),则不执行小程序登录流程。【这时还不知道微信登录态是否失效】
- 检查登录态
- 登录态失效,执行小程序登录流程。
- 登录态有效,不操作。
- 等待用户操作getUserInfo,getPhoneNumber等操作
- 用户操作回调方法中把加密数据发送到服务器进行解密
处理方式二
- 等待用户操作getUserInfo,getPhoneNumber等操作
- 检查是否登录
- 未登录(本地token为空或接口返回token失效)则执行小程序登录流程,本地保存最新token【这时微信登录态是有效的,因为这过程重新获取了session_key】
- 已登录(本地token不为空且接口返回token未失效),则不执行小程序登录流程。【这时还不知道微信登录态是否失效】
- 检查登录态
- 登录态失效,执行小程序登录流程。
- 登录态有效,不操作。
- 如果2,3步骤中有执行过小程序登陆流程,则提示用户重新点击,转到1
- 把加密数据发送到服务器进行解密
-
微信小程序授权
为什么要授权?
在与用户交互的过程中,我们需要获取并记录用户的一些信息,以提供个性化的服务,而这些用户信息涉及到隐私,这时候就需要用户授权同意使用这些信息。
获取信息的流程
-
检查用户是否已经授权
调用wx.getSetting(),如果已授权,转3,如果未授权,转2
-
引导用户授权
展现授权按钮,用户点击并同意
-
获取用户信息
调用对应的信息获取接口或在用户点击按钮的回调事件中获取用户信息
如 wx.getUserInfo(),wx.getLocation()
授权是不是一定要登录?
授权并不需要微信登录,但很多时候授权获取用户信息时,获取到的信息需要进行解密,这时需要有效的 session_key,所以当 session_key失效时,就需要重新执行微信登录来更新session_key。
反之,登录也并不需要授权,只有在需要获取用户信息时才需要授权。
换手机登录微信会发生什么?
token失效,因为token保存在本地,换手机后没有原手机上保存的token,或跟原手机的token不一样
微信登录态不变,如果还在有效期内,换手机后调用wx.checkSession()仍然会返回有效