Shaw0xyz 发表于 2024-7-7 17:54:27

微信小程序 - session_key 详解

本帖最后由 Shaw0xyz 于 2024-7-7 19:51 编辑

1. 引言

微信小程序在用户授权登录时,会通过 `code` 换取 `session_key`。`session_key` 是微信小程序中用来维护用户会话的重要凭证。本文将详细介绍 `session_key` 的生成、使用和安全性,以及如何在开发中正确管理 `session_key`。

2. `session_key` 概述

`session_key` 是微信服务器在用户登录时生成的会话密钥,用于对用户数据进行加密和解密。通过 `session_key`,开发者可以获取用户的基本信息和敏感数据。

3. `session_key` 的生成

3.1 登录流程

微信小程序的登录流程包括以下步骤:
(1) 小程序调用 `wx.login()` 获取临时登录凭证 `code`。
(2) 小程序将 `code` 发送到开发者服务器。
(3) 开发者服务器使用 `code` 调用微信登录凭证校验接口 `https://api.weixin.qq.com/sns/jscode2session`,获取 `session_key` 和 `openid`。

示例代码如下:

wx.login({
success (res) {
    if (res.code) {
      // 发送 res.code 到开发者服务器
      wx.request({
      url: 'https://yourserver.com/login',
      data: {
          code: res.code
      },
      success (res) {
          console.log(res.data)
      }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
}
})

3.2 获取 `session_key`

开发者服务器收到 `code` 后,调用微信登录凭证校验接口:

https://api.weixin.qq.com/sns/js ... =authorization_code

接口返回示例如下:

{
"openid": "OPENID",
"session_key": "SESSION_KEY",
"unionid": "UNIONID"
}

4. `session_key` 的使用

`session_key` 主要用于以下两种场景:
(1) 解密用户敏感数据
(2) 维护用户会话

4.1 解密用户敏感数据

通过 `session_key`,开发者可以解密用户敏感数据,如 `encryptedData` 和 `iv`。示例代码如下:

const crypto = require('crypto');

function decryptData(sessionKey, encryptedData, iv) {
const decipher = crypto.createDecipheriv('aes-128-cbc', Buffer.from(sessionKey, 'base64'), Buffer.from(iv, 'base64'));
let decrypted = decipher.update(Buffer.from(encryptedData, 'base64'), 'binary', 'utf8');
decrypted += decipher.final('utf8');
return JSON.parse(decrypted);
}

4.2 维护用户会话

`session_key` 也可以用于维护用户会话。在小程序端获取到 `session_key` 后,可以在服务器端建立会话,结合用户的 `openid`,实现用户的登录状态管理。

5. `session_key` 的安全性

`session_key` 是敏感信息,必须妥善保管。以下是一些安全性建议:
(1) 不要在前端直接存储或传递 `session_key`,应保存在服务器端。
(2) 建立完善的会话机制,定期更新 `session_key`。
(3) 使用 HTTPS 加密通信,防止网络窃听。

6. 实践案例

6.1 用户登录并获取信息

在用户登录后,获取 `session_key` 和 `openid`,然后解密用户的敏感数据,如昵称和头像。示例代码如下:

wx.login({
success (res) {
    if (res.code) {
      wx.request({
      url: 'https://yourserver.com/login',
      data: {
          code: res.code
      },
      success (loginRes) {
          const sessionKey = loginRes.data.session_key;
          wx.getUserInfo({
            success: function(userInfoRes) {
            const userInfo = decryptData(sessionKey, userInfoRes.encryptedData, userInfoRes.iv);
            console.log(userInfo);
            }
          })
      }
      })
    }
}
})

6.2 服务器端会话管理

在服务器端,使用 `session_key` 和 `openid` 建立会话。示例代码如下:

const sessions = {};

function handleLogin(req, res) {
const code = req.body.code;
// 调用微信接口获取 session_key 和 openid
const sessionKey = getSessionKeyFromWeChat(code);
const openid = getOpenIdFromWeChat(code);
const sessionId = generateSessionId();
sessions = { sessionKey, openid };
res.send({ sessionId });
}

7. 结论

通过本文的介绍,读者可以了解 `session_key` 的生成、使用和安全管理。`session_key` 是微信小程序中维护用户会话的重要机制,正确使用和保护 `session_key` 对于保证用户数据的安全至关重要。








/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & Linux ...

~互撩~ TG: @Shaw_0xyz
页: [1]
查看完整版本: 微信小程序 - session_key 详解