小程序开放平台

文档中心
快速入门
开发准备
本地开发
部署发布
功能服务
函数服务
云服务密钥
日志查询
公共错误码
免登录
常见问题

云服务 - 免登录

开发指南
>
功能服务
>
免登录
>
更新时间:2026-01-20 16:19:42

介绍

小红书云托管提供的是后端云服务,从一定程度上来说,和之前使用的服务器一样,都是为小程序的运行提供后端支撑的。

小红书云托管有很多优势,除了容器化之外,最核心的,就是其强大的小红书生态属性。

小程序原始实名登录

当服务端要判定一个小程序用户到底是谁的时候,原始登录流程如下:

通过小程序的

xhs.login
方法,获取一个
code
。使用这个
code
在后端向开放平台寻求认证,最终得到这个用户的身份 ID,一般叫做
openid
(一个小红书用户和一个小程序的关系称为
openid
,不同用户不同小程序的
openid
都不一样)。

Description

由此我们可以判定身份,将自己业务的用户库和小红书的用户体系关联起来。

后端服务需要根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。在调用

xhs.login
后,通过 code2session 接口获取的会话密钥
session_key
是对用户数据进行加密签名的密钥。为了应用自身的数据安全,不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。

小红书开放平台云服务登录优化

当项目从服务器迁移到小红书云中进行云托管时,

code
置换登录的流程就没有存在的必要了。

在小程序/小组件端,通过

xhs.cloud.callContainer
向云服务发起请求时,无需维护复杂的鉴权机制,即可获取天然可信任的用户登录态(openid)

HTTP header

HTTP header
说明
xhs-open-id
xhs openid
xhs-cloud-env-id
云环境 ID
xhs-cloud-function-id
云函数 ID
xhs-app-id
小程序 AppID

环境变量

环境变量
说明
XHS_CLOUD_ENV_ID
云环境 ID
XHS_CLOUD_FUNCTION_ID
云函数 ID
XHS_CLOUD_ENV_VERSION
云函数版本(IDE 内默认 LATEST)
XHS_APP_ID
小程序/组件 appid

在此可以直接从 HTTP header 中拿到信息后做业务判定,然后进行业务正常服务。

这个能力是不带任何条件的,小程序只要使用

xhs.cloud.callContainer
,云托管服务收到这个请求,信息就自然而然带入进来了。

不仅省去了

code
转换的步骤,而且还不需要自己做登录态了,可以在任意请求都可以拿到用户的身份信息。

后端代码示例

javascript
/**
 * 获取用户信息示例函数
 * 
 * 功能:
 * - 从 HTTP header 中获取云托管相关信息
 * - 从环境变量中获取云函数配置信息
 * - 演示如何在云函数中使用免登录能力
 * 
 * 示例:
 * - GET /user/info
 */
exports.getUserInfo = async function getUserInfo(event, context) {
  console.log('[getUserInfo] 函数调用开始', {
    ctxId: context?.ctxId,
    eventID: context?.eventID,
    timestamp: new Date().toISOString(),
  });

  // 从 HTTP header 中获取云托管相关信息
  const envId = context.headers['xhs-cloud-env-id'];
  const functionId = context.headers['xhs-cloud-function-id'];
  const appId = context.headers['xhs-app-id'];

  if (!envId) {
    console.log('[getUserInfo] 错误:xhs-cloud-env-id 为空');
    return {
      ok: false,
      code: 400,
      message: "MISSING_ENV_ID",
      detail: "xhs-cloud-env-id 为空",
    };
  }

  // 从环境变量获取云函数配置信息
  const cloudEnvId = process.env.XHS_CLOUD_ENV_ID;
  const cloudFunctionId = process.env.XHS_CLOUD_FUNCTION_ID;
  const cloudEnvVersion = process.env.XHS_CLOUD_ENV_VERSION;
  const appIdFromEnv = process.env.XHS_APP_ID;

  console.log('[getUserInfo] 获取到的信息', {
    headers: {
      envId,
      functionId,
      appId,
    },
    envVars: {
      cloudEnvId,
      cloudFunctionId,
      cloudEnvVersion,
      appIdFromEnv,
    },
  });

  return {
    ok: true,
    code: 0,
    message: "GET_USER_INFO_OK",
    data: {
      headers: {
        envId,
        functionId,
        appId,
      },
      envVars: {
        cloudEnvId,
        cloudFunctionId,
        cloudEnvVersion,
        appIdFromEnv,
      },
      note: "这些信息可以直接用于业务逻辑,无需额外的登录流程",
    },
    contentType: "application/json",
    meta: {
      ctxId: context.ctxId,
      eventID: context.eventID,
      eventType: context.eventType,
    },
  };
};

常见问题

服务部署在小红书云上后,原有的 code2session 流程还可以使用吗?

如果坚持使用原本的

code2session
置换
code
登录这个流程,也没有什么问题。云服务本身并不会阻碍你这么用,但需要明确的是,这种情况并不是小红书云所推荐的,后续的迭代的功能都是基于云上的免登录流程。