小程序登录流程
登录流程步骤有哪些?
session_key作用是什么?
encryptedData/iv是什么?
传统的web开发实现登陆功能,一般的做法是输入账号密码登录,存储token,判断token是否过期,而小程序,是利用微信官方提供的登录能力相关api方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系,从而实现登陆功能
- 通过
wx.login()获取到用户的code判断用户是否授权读取用户信息,调用wx.getUserInfo读取用户数据
1、需要自身后端调用微信服务器获取用户信息
2、code是登录凭证
登录流程步骤
- 1、
open-type="getPhoneNumber": 获取用户手机号,可以从bindgetphonenumber回调中获取到用户信息
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">
授权登录
</button>
- 2、获取用户信息, 获取
encryptedData 、iv参数回传给后端,后端结合session_key进行解密返回信息
async getPhoneNumber(e){
const { iv, encryptedData } = e.detail;
if (iv && encryptedData) {
await wx.request({
url:'xxx'
})
}
}
注意:调用getPhoneNumber的时候,如果又调用了wx.login,会导致
session_key被冲掉,解密的时候,此时的session_key已经不是加密时的session_key了,导致解密失败
新版本手机号授权流程
从基础库2.21.2开始,对步骤2中换取手机号信息的方式进行了安全升级,上述为新方式使用指南。(旧方式目前可以继续使用,但建议开发者使用新方式,以增强小程序安全性)另外,新方式不再需要提前调用wx.login进行登录。
- 1、通过button的
getPhoneNumber的接口 来进行手机号授权 - 2、用户允许授权之后,获取
code动态令牌 - 3、把这个
code令牌传给后台,后台调用微信提供的api phonenumber.getPhoneNumber 接口- 通过
code来换取用户手机号
- 通过
每个code有效期为5分钟,且只能消费一次。
Page({
getPhoneNumber (e) {
let detail = e.detail;
console.log(detail);
if (detail.errMsg === "getPhoneNumber:ok") {
console.log('用户同意授权');
let code = detail.code; // 动态令牌
console.log(code);
wx.request({
url: '你的接口,比如登录',
data: {
code
},
success(res) {
console.log(res.data); // 后端返回解析出的手机号,或者直接返回登录成功的信息
}
})
} else {
console.log('用户拒绝授权');
}
}
})
session_key作用是什么?
小程序中的 session_key 是一个密钥,用于将用户数据进行加密签名,其中也包括用于解密 encryptedData 的过程。 另外,session_key 还可以帮助开发者校验当前小程序的登录状态是否有效,避免重复的登录流程操作。如果 session_key 失效了,开发者可以重新执行登录流程来获取有效的 session_key。你可以通过 wx.checkSession 接口来检查你的 session_key 是否有效
session_key的有效期相对较短,在一段时间后会过期失效。- 它是一个临时的、与用户绑定的密钥,用于后续对用户敏感数据的加解密
- 生成
session_key是由微信服务器进行操作的,开发者无需自行生成。微信会在用户登录小程序时,为每个用户生成一个临时的session_key,作为用户与小程序之间通信的加密密钥
encryptedData/iv是什么?
encryptedData(加密数据):是用户敏感数据在传输过程中使用会话密钥进行加密后的结果。例如,用户的手机号、用户信息等都可以通过encryptedData进行加密保护,确保数据在传输过程中的安全性。iv(初始向量):是对加密数据进行解密时所需的初始向量参数。它是一个随机生成的字符串,用于增加加密算法的随机性和安全性。在解密过程中,需要使用iv与session_key一起对加密数据进行解密还原。
通常需要使用
encryptedData和iv进行解密操作。
session_key过期如何处理
1、wx.login 调用时,用户的 session_key会被更新而致使旧 session_key 失效
2、使用接口 wx.checkSession可以校验 session_key 是否有效
- session_key过期之后,需要重新授权登录 【提示:登录过期,请重新登录】
- 更好的用户体验,可以定期刷新 session_key,保持用户登录状态的持久性
- 客户端和服务端共同约定一个合适的时间周期,在周期内主动调用微信的刷新接口(如
auth.code2Session),获取到新的 session_key
- 客户端和服务端共同约定一个合适的时间周期,在周期内主动调用微信的刷新接口(如
一键登录如何实现
其实一键登录和普通登录流程是类似的,都是调用微信登录相关api
- 1、当用户点击一键登录按钮时,触发微信相关的登录api
- 2、调用
wx.login()方法获取用户的登录凭证(code) - 3、将获取的登录凭证发送到后端服务器,后端服务器需要与微信的服务器进行交互。
- 4、后端服务器调用微信提供的
auth.code2Session接口,传递登录凭证,获取用户的唯一标识 OpenID 和会话密钥 SessionKey。 - 5、后端服务器根据获取到的 OpenID 和 SessionKey 进行业务逻辑处理,例如用户校验、生成用户令牌等。
- 6、后端服务器将处理结果返回给小程序前端
通过
wx.login()和wx.getUserInfo()组合使用,实现一键登录的同时获取用户的基本信息,如头像、昵称等,以便在小程序中展示用户相关信息。
微信提供了几种登录机制
微信小程序登录授权,有三种方式,
- 无感登录
- 手机号登录
- 用户信息授权登录
无感登录
参考:https://www.cnblogs.com/caihongmin/p/17048599.html
wx.login获取到 code后,把code传递给后端,后端通过接口去微信后端换取到 openid 和 sessionKey
- 前端调用wx.login,拿到登陆凭证code,通过wx.request发起网络请求
- 后端那边利用code + appid + appsecret这三个数值,调用微信的auth.code2Session接口,拿到用户唯一标识openid 和 会话密钥session_key
- 定义token,与openid和session_key关联,最后再返回给前端
无感登录,简单来说就是拿小程序token的过程
wx.login行为是静默,不必授权的,用户不会察觉。
手机号登陆
需要注意的是,个人账号,无法使用手机号登录功能,并且该功能是收费的
-
1、通过getPhoneNumber的接口 来进行手机号授权
-
2、用户允许授权之后,获取
code动态令牌 -
3、把这个
code令牌传给后端
用户信息授权登录
该登陆主要为了获取用户信息(姓名、性别、地址、昵称等等),用于给个人中心模块做铺垫
- wx.getUserInfo获取用户信息,不会有底部弹窗,而wx.getUserProfile则会出现下方的底部弹窗
- 底部弹窗的方式来获取用户信息授权
授权登录
- 1、用户通过点击小程序提供的授权登录按钮
- 2、点击这个允许授权之后,获取相关的信息
iv,encryptedDataiv是初始向量,用于解密时所需的初始向量参数encrytedData加密数据 【用户的敏感】
- 3、获取
encryptedData 、iv参数回传给后端 - 4、后端进行解密,返回对应的信息,返回session_key
- 5、前端就把session_key存储到本地,后续通过这个session_key来验证身份