当前位置:   article > 正文

Node.js +小程序登录详解(新)(session_key、openid、3rd_session、wx.request())_js开发微信小程序登录

js开发微信小程序登录

前言

此篇内容记录本人编程过程中所遇到的一些问题和解决的办法。仅供参考,有些内容引用别处。[非商用,如侵删]

正文

先看图 基于小程序官方给出的图片 经过网上查找 到一张更加详细的时序表

在这里插入图片描述

图片引自:东边的小山:微信小程序获取用户信息并保存登录状态详解

根据疑惑我把这张图中的内容拆分成一个个小的问题来解决

第一步:通过code获取openid和session_key

微信小程序端 App.js wx.login引用官方文档的示例

1)、获取code、iv、encryptedData

iv和encryptedData后面用来解密用户信息

//  小程序全局只触发一次 触发时机为初始化后执行的生命周期函数,
onLaunch(){
wx.getUserProfile({
      lang: 'zh_CN',
      desc: 'desc',
      success(res) {
        const {encryptedData,iv} = res
        wx.login({
          success(res) {
            wx.request({
              url: 'http://localhost:3000/api/user/sendcode',
              data: {
                code: res.code,
                iv,
                encryptedData,
                }
             })
          }
       })
     }
  })
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

调用wx.login()方法 将获取到的 res.code 通过 wx.request() 发送到后端 接收到数据后把数据保存起来

获取到的code
iv和encryptedData
在这里插入图片描述

2)、获取session_Key和openid

后端携带 Appid、AppSecret、code向微信服务器发起GET请求

	const { iv, code, encryptedData } = req.query// 解构赋值
    // 向微信服务器发起get请求 通过 code 换取 Session_key 和 openid
    let wxURl = `https://api.weixin.qq.com/sns/jscode2session?
                 appid=${wxAppkey.appid}
                 &secret=${wxAppkey.secret}
                 &js_code=${code}
                 &grant_type=authorization_code`
    // 保存请求结果
    const { data } = await $.get(wxURl)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

至此 我们已经拿到了 session_key 和 openid 的值

3)、解密获取用户信息

官方有给出demo > 开放数据校验与解密在这里插入图片描述
node 实例

WXBizDataCrypt.js

var crypto = require('crypto')

function WXBizDataCrypt(appId, sessionKey) {
  this.appId = appId
  this.sessionKey = sessionKey
}

WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
  //转换为base64格式数据
  iv = Buffer.from(iv, 'base64')
  encryptedData = Buffer.from(encryptedData, 'base64')
  sessionKey = Buffer.from(this.sessionKey, 'base64')

  try {
    //根据给定的算法,密钥和初始化向量,创建并返回一个Decipher解密对象。
    var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv)
    // 设置自动 padding 为 true,删除填充补位
    decipher.setAutoPadding(true)
    //往decipher实例中添加数据,第一个参数是数据,第二个参数是传入数据的格式,默认是 ‘binary’。第三个参数是返回的数据格式。
    var decoded = decipher.update(encryptedData, 'binary', 'utf8')
    //返回任何剩余的解密内容。不能调用多次
    decoded += decipher.final('utf8')
    decoded = JSON.parse(decoded)

  } catch (err) {
    throw new Error('Illegal Buffer')
  }
  //检验是否获取正确,是当前appid的数据
  if (decoded.watermark.appid !== this.appId) {
    throw new Error('Illegal Buffer')
  }

  return decoded
}

module.exports = WXBizDataCrypt

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

puzzle.js

const WXBizDataCrypt = require('./WXBizDataCrypt')
const { wxAppkey } = require('../../config/wxappConfig')


function getPuzzleUserinfo(sessionKey, encryptedData, iv) {
  // 创建实例将appid 和session_key传入原型中
  const pc = new WXBizDataCrypt(wxAppkey.appid, sessionKey)
  // 将传入的iv,encryptedData,和实例原型中的session_key 一起进行解密 结果返回给data
  const data = pc.decryptData(encryptedData, iv)
  return data
}

module.exports = {
  getPuzzleUserinfo
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

*了解:什么是3rd_session?(自定义登录态)

什么是登陆态:

抱着这个疑惑我去网络上找各种答案,零零散散的看了很多:

所谓登录态,就是程序在运行时,能够识别当前用户,能够证明自己的唯一性且合法。
WEB服务器通过浏览器携带的token获取session来判断是否是同一用户(或浏览器);Restful服务通过客户端传过来唯一ID,来识别调用用户

以上内容引自微信小程序登录态

希望帮助理解,我的理解:
登录态是用来校验用户在小程序端第三方服务器端的登录状态,类似与传统Web项目中的token和sseion。

什么是自定义登录态?

我的理解就是是自己生成的一个字符串 用于验证用户登录态的伪token然后我们需要为其设定失效时间并保管在缓存(我这里用的redis)中,用户每次发起请求都要携带这个伪token,然后我们判断Token是否过期决定能否请求成功,如果未过期,返回相关的数据,如果过期了则需要用户重新发起登录请求重新返回给其token值。

第二步:生成自定义登录态并传入缓存

先继续上码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/131857?site
推荐阅读
相关标签