小红书JS SDK签名过程

第一步:获取access_token(第一次加签)

目的 :用你的永久密钥(appSecret)向小红书服务器换取一个临时密钥(access_token)。这个临时密钥后续将代替appSecret进行签名,更安全。

执行方 :你的应用服务器后端appSecret必须保存在后端,绝不能泄露到前端)

详细过程

  1. 准备参数

    • app_key: 你在小红书开放平台申请应用后获得的唯一标识。
    • nonce: 生成一个32位以内的随机字符串(如:"aBc123xYz")。这个值需要记录下来,因为下一步还会用到。
    • timestamp: 获取当前的毫秒级时间戳(如:1727689200000)。这个值也需要记录下来
    • appSecret: 你的应用密钥,从平台获取,这是你的核心机密。
    • expires_in: (可选) 希望access_token过期的具体时间戳,不传则默认为24小时。
  2. 生成签名(第一次加签)

    • 使用文档中提供的 SignatureUtil.buildSignature 方法或类似逻辑。
    • 调用方式String signature = buildSignature(app_key, nonce, timestamp, appSecret);
    • 注意 :这里第四个参数传入的是 appSecret
    • 其内部逻辑是:将 appKey, nonce, timeStamp 按字母顺序排序后拼接成字符串,最后追加上appSecret,然后对整个字符串做SHA-256哈希计算,得到十六进制的签名。
  3. 发送HTTP请求

    • URL : POST https://edith.xiaohongshu.com/api/sns/v1/ext/access/token

    • Headers : Content-Type: application/json

    • Body (JSON格式) :

      json 复制代码
      {
        "app_key": "你的app_key",
        "nonce": "刚才生成的随机数nonce",
        "timestamp": "刚才生成的时间戳timestamp",
        "signature": "第一步计算出来的签名signature",
        "expires_in": 1727775600000 // 可选参数
      }
  4. 处理响应

    • 小红书服务器会验证你的签名。如果验证通过,会返回一个JSON响应:

      json 复制代码
      {
        "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", // 一串很长的令牌字符串
        "expires_in": 1727775600000 // 这个token的过期时间戳
      }
    • 你的后端需要将这个 access_token 安全地存储起来(例如在内存或缓存中),并记录它的过期时间。


第二步:生成JS签名signature(第二次加签)

目的 :为前端生成调用JS SDK所需的最终签名。这次签名使用的密钥是上一步获取的access_token,而不是appSecret

执行方 :你的应用服务器后端

详细过程

  1. 准备参数

    • appKey: 同上,还是你的应用标识。
    • nonce: 生成一个新的32位以内的随机字符串(不能使用第一步用过的那个)。
    • timestamp: 获取一个新的当前毫秒级时间戳
    • access_token: 从上一步响应中获取到的临时令牌。
  2. 生成签名(第二次加签)

    • 再次使用 SignatureUtil.buildSignature 方法。
    • 调用方式String signature = buildSignature(app_key, new_nonce, new_timestamp, access_token);
    • 关键区别 :这里第四个参数传入的是 access_token,而不是 appSecret
    • 其内部逻辑完全相同,只是密钥换了:排序拼接 appKey, 新的nonce, 新的timestamp,然后追加上access_token,最后做SHA-256哈希。

第三步:返回参数并唤起JS SDK

目的:将必要的参数安全地传递给前端,让前端能够初始化并唤起小红书的JS SDK。

执行方

  • 提供参数 :你的应用服务器后端
  • 使用参数 :你的Web前端(浏览器)

详细过程

  1. 后端返回参数

    你的后端通过API接口(或直接渲染在页面里)将以下四个参数返回给前端:

    • appKey: 应用标识。
    • nonce: 第二步中使用的新生成的随机数
    • timestamp: 第二步中使用的新生成的时间戳
    • signature: 第二步中计算出来的最终签名

    注意access_token 不需要给前端,它只用于后端生成签名。)

  2. 前端初始化SDK

    你的前端页面在引入小红书的JS SDK后,会使用后端传过来的四个参数进行初始化配置。

    javascript 复制代码
    // 伪代码示例
    const config = {
      appKey: '从后端获取的appKey',      // 对应参数1
      nonce: '从后端获取的new_nonce',    // 对应参数2
      timestamp: '从后端获取的new_timestamp', // 对应参数3
      signature: '从后端获取的signature', // 对应参数4
      // ... 其他业务参数
    };
    
    // 初始化小红书JS SDK并调用相应功能
    xhs.init(config);
    xhs.share(...);
  3. 小红书SDK验签

    前端SDK会将这些参数发送给小红书。小红书服务器会使用你传来的 appKey 找到对应的 access_token,然后用和你第二步一模一样的算法 重新生成一次签名,并比对前端传来的 signature

    • 如果一致,验签通过,SDK功能成功唤起。
    • 如果不一致,或时间戳过期,或随机数已被使用,则验签失败,SDK调用会报错。

总结与类比

步骤 核心操作 使用的密钥 目的
第一步 向小红书换"临时通行证" appSecret (永久密码) 获取 access_token
第二步 为前端生成"门票"的签名 access_token (临时通行证) 生成最终给前端的 signature
第三步 前端出示"门票" (无) 验证门票真实性并唤起SDK

这个过程通过两次签名,确保了整个流程的安全性和不可篡改性,同时保护了最核心的appSecret不参与网络传输。

相关推荐
MediaTea2 小时前
Python:math 库函数手册(双曲函数)
开发语言·python
muchu_CSDN2 小时前
谷粒商城项目-P16快速开发-人人开源搭建后台管理系统
前端·javascript·vue.js
€8112 小时前
Java入门级教程16——JUC的安全并发包机制
java·开发语言·juc的安全并发包机制·栅栏机制·闭锁机制·信号量机制·无锁机制
薛定谔的算法2 小时前
JavaScript队列实现详解:从基础到性能优化
javascript·数据结构·算法
Sui_Network2 小时前
GraphQL RPC 与通用索引器公测介绍:为 Sui 带来更强大的数据层
javascript·人工智能·后端·rpc·去中心化·区块链·graphql
Cache技术分享2 小时前
186. Java 模式匹配 - Java 21 新特性:Record Pattern(记录模式匹配)
前端·javascript·后端
叫我詹躲躲2 小时前
前端竟能做出这种专业医疗工具?DICOM Viewer 医学影像查看器
前端·javascript·vue.js
子兮曰2 小时前
🚀彻底掌握异步编程:async/await + Generator 深度解析与20个实战案例
前端·javascript·typescript
猿如意3 小时前
vue项目的main.js规划设计与合理使用
前端·javascript·vue.js