微信小程序的登录过程简介

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/stpeace/article/details/78025110

        对于微信而言, 小程序算是第三方了, 那么, 小程序是如何登录的呢? 微信肯定不能把密码给小程序, 让小程序来登录啊, 小程序甚至无法获取微信的微信号。 在这里, 我们需要彻底把微信和小程序分开, 割裂来看, 才好理解。

        那小程序是怎样来登录的呢? 这就涉及到微信开放平台了。我们知道, 很多网站支持QQ登录, 支持微博登录, 也支持微信登录。 这种借账号体系的行为, 我们早就讨论过, 无需赘述。 我们知道, 每个用微信的人, 都一个微信号, 那么从微信中进入小程序, 就需要一个什么号来标识这个小程序, 这就是openID,  对于同一个小程序而言, 不同用户的openID是不一致的, 这在oAuth协议中有介绍。

        下面, 我们来看看小程序的登录过程。

        小程序调用wx.login函数, 获取与这个用户对应的code(js_code),  然后把这code带给小程序后台, 于是乎小程序后台就拿到了区别于用户的code, 这实际上是微信给小程序的一个登录态标志, 有点像token/session, 其实不是像, 而是是。 虽然每个用户的code不一样, 但当然不能以这个作为区分每个用户的标志啊, 因为code会变化(过期), 所以思来想去, 还是用与微信号有一一对应关系的openID更为靠谱。

         来一起看看微信公众平台的介绍:


wx.login(OBJECT)

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

注:调用 login 会引起登录态的刷新,之前的 sessionKey 可能会失效。

OBJECT参数说明:

参数名 类型 必填 说明
success Function 接口调用成功的回调函数
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

success返回参数说明:

参数名 类型 说明
errMsg String 调用结果
code String 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 api,使用 code 换取 openid 和 session_key 等信息

示例代码:

//app.js
App({
  onLaunch: function() {
    wx.login({
      success: function(res) {
        if (res.code) {
          //发起网络请求
          wx.request({
            url: 'https://test.com/onLogin',
            data: {
              code: res.code
            }
          })
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    });
  }
})

code 换取 session_key

​这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。

session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输

接口地址:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

请求参数:

参数 必填 说明
appid 小程序唯一标识
secret 小程序的 app secret
js_code 登录时获取的 code
grant_type 填写为 authorization_code

返回参数:

参数 说明
openid 用户唯一标识
session_key 会话密钥
unionid 用户在开放平台的唯一标识符。本字段在满足一定条件的情况下才返回。具体参看UnionID机制说明

返回说明:

//正常返回的JSON数据包
{
      "openid": "OPENID",
      "session_key": "SESSIONKEY",
      "unionid": "UNIONID"
}
//错误时返回JSON数据包(示例为Code无效)
{
    "errcode": 40029,
    "errmsg": "invalid code"
}

wx.checkSession(OBJECT)

通过上述接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能失效。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。开发者只需要调用wx.checkSession接口检测当前用户登录态是否有效。登录态过期后开发者可以再调用wx.login获取新的用户登录态。

OBJECT参数说明:

参数名 类型 必填 说明
success Function 接口调用成功的回调函数,登录态未过期
fail Function 接口调用失败的回调函数,登录态已过期
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

示例代码:

wx.checkSession({
  success: function(){
    //session 未过期,并且在本生命周期一直有效
  },
  fail: function(){
    //登录态过期
    wx.login() //重新登录
    ....
  }
})

登录态维护

通过 wx.login 获取到用户登录态之后,需要维护登录态。

开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。对于开发者自己生成的 session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在 storage ,用于后续通信使用。

通过 wx.checkSession 可以检测用户登录态是否失效。并决定是否调用 wx.login 重新获取登录态

登录时序图


        值得注意的是, code可以认为是微信给小程序的一个登录态票据, 而3rd_session则是小程序后台给小程序的登录态票据。 在后续的会话中, 真正的主角是小程序和小程序后台, 所有的业务逻辑应该围绕小程序和小程序后台展开,微信和微信后台退居幕后(只能提供了开放登录接口的能力、和基础的api功能而已)

        在后续的读写访问中, 3rd_session作为登录态票据, 来访问小程序后台, 执行对应的动作。 小程序后台则要进行登录态校验。

        其实, 很简单。



展开阅读全文

没有更多推荐了,返回首页