前言:最近在做一个微信小程序项目,其中一个必须的功能就是登录,而小程序的登录流程似乎比其他项目更复杂一些,所以在这里详细的记录一下。
一. 小程序登录基本流程介绍
1. 首先放一张官方文档的流程图:
过程:
1. 小程序端调用 wx.login 获取 code (临时登录凭证 code 只能使用一次)。
这一步获取的 code 作用是表示用户已授权获取用户信息,但用户信息分为 非敏感信息 和 敏感信息,这两者区别稍后会介绍到。
2. 由于小程序后台授权域名无法授权微信的域名,所以我们只能通过我们自己的服务器去调用微信服务器去获取用户信息。故我们将 wx.login 获取 code 通过 wx.request 请求传入后台。
3. 后台调用 auth.code2SessIon 接口,换取用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识 UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key。
openID:就像一个人的身份证一样,每一个小程序用户都有一个唯一的 openID,
unionID:如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。
session_key:是开发者后台校验与解密开放数据的密匙之一,是微信官方返回的登录状态,保证了当前用户进行会话操作的有效性。(这里需要解密的开放数据就是敏感数据,如电话号) 解密算法共有 3 个密匙 另外两个是 iv 和 encryptedData,详情见 开放数据校验及解密
4. 自定义登录态与 openid 和 session_key 相关联,并把自定义登录态返回给小程序端。
为什么需要自定义登录态间接实现登录,用返回的 session_key 不是也行吗?前面也介绍了用户数据里存在敏感数据,考虑到安全性因素,如果直接使用微信服务端派发的 session_key 来作为业务方的登录态使用,会被“有心之人”用来获取用户的敏感信息,比如 wx.getUserInfo() 这个接口呢,就需要session_key来配合解密微信用户的敏感信息。那么我们如果生成自己的登录态标识呢,这里可以使用几种常见的不可逆的哈希算法,比如md5、sha1等,将生成后的登录态标识(这里我们统称为\'skey\')返回给前端,并在前端维护这份登录态标识(一般是存入storage)。而在服务端呢,我们会把生成的skey当做键,session_key等信息当做值,存入一张表中,前端通过传递skey来存取用户的信息。
5. 小程序端存储获取到的自定义登录态,在需要的请求中携带自定义登录态。
前面我们将skey存入前端的storage里,每次进行用户数据请求时会带上skey,那么如果此时session_key过期呢?所以我们需要调用到 wx.checkSession() 这个API来校验当前 session_key 是否已经过期,这个API并不需要传入任何有关session_key的信息参数,而是微信小程序自己去调自己的服务来查询用户最近一次生成的 session_key 是否过期。如果当前 session_key 过期,就让用户来重新登录,更新 session_key,并将最新的skey存入用户数据表中。
6. 后台则通过自定义登录态查询 openid 和 session_key,验证通过后返回业务数据。
请发表评论