找回密码
 立即注册
查看: 515|回复: 0

[其它] 微信小程序 - session_key 详解

[复制链接]

279

主题

0

回帖

964

积分

超级版主

积分
964
发表于 2024-7-7 17:54:27 | 显示全部楼层 |阅读模式
本帖最后由 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`。

示例代码如下:

  1. wx.login({
  2.   success (res) {
  3.     if (res.code) {
  4.       // 发送 res.code 到开发者服务器
  5.       wx.request({
  6.         url: 'https://yourserver.com/login',
  7.         data: {
  8.           code: res.code
  9.         },
  10.         success (res) {
  11.           console.log(res.data)
  12.         }
  13.       })
  14.     } else {
  15.       console.log('登录失败!' + res.errMsg)
  16.     }
  17.   }
  18. })
复制代码


3.2 获取 `session_key`

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

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

接口返回示例如下:

  1. {
  2.   "openid": "OPENID",
  3.   "session_key": "SESSION_KEY",
  4.   "unionid": "UNIONID"
  5. }
复制代码


4. `session_key` 的使用

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

4.1 解密用户敏感数据

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

  1. const crypto = require('crypto');

  2. function decryptData(sessionKey, encryptedData, iv) {
  3.   const decipher = crypto.createDecipheriv('aes-128-cbc', Buffer.from(sessionKey, 'base64'), Buffer.from(iv, 'base64'));
  4.   let decrypted = decipher.update(Buffer.from(encryptedData, 'base64'), 'binary', 'utf8');
  5.   decrypted += decipher.final('utf8');
  6.   return JSON.parse(decrypted);
  7. }
复制代码


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`,然后解密用户的敏感数据,如昵称和头像。示例代码如下:

  1. wx.login({
  2.   success (res) {
  3.     if (res.code) {
  4.       wx.request({
  5.         url: 'https://yourserver.com/login',
  6.         data: {
  7.           code: res.code
  8.         },
  9.         success (loginRes) {
  10.           const sessionKey = loginRes.data.session_key;
  11.           wx.getUserInfo({
  12.             success: function(userInfoRes) {
  13.               const userInfo = decryptData(sessionKey, userInfoRes.encryptedData, userInfoRes.iv);
  14.               console.log(userInfo);
  15.             }
  16.           })
  17.         }
  18.       })
  19.     }
  20.   }
  21. })
复制代码


6.2 服务器端会话管理

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

  1. const sessions = {};

  2. function handleLogin(req, res) {
  3.   const code = req.body.code;
  4.   // 调用微信接口获取 session_key 和 openid
  5.   const sessionKey = getSessionKeyFromWeChat(code);
  6.   const openid = getOpenIdFromWeChat(code);
  7.   const sessionId = generateSessionId();
  8.   sessions[sessionId] = { sessionKey, openid };
  9.   res.send({ sessionId });
  10. }
复制代码


7. 结论

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








/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & linux ...

~互撩~ TG: @Shaw_0xyz
荔枝学姐爱吃荔枝!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:40 , Processed in 0.063679 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表