跳到主要内容

云托管与身份认证服务如何结合使用

云托管服务可以与云开发的身份认证服务结合,实现用户登录态的验证和管理。本文介绍推荐的集成方案。

集成方案概述

云托管与身份认证的集成主要有以下几种方式:

方式说明适用场景
开启 HTTP 身份认证(推荐)在 HTTP 访问服务中开启身份认证,网关自动验证最简便的鉴权方式
SDK 调用自动携带身份通过 SDK 调用时自动传递用户信息小程序/Web SDK 调用
自定义 Token 验证后端代码验证 Token需要自定义鉴权逻辑

方案一:开启 HTTP 身份认证(推荐)

这是最简便的鉴权方式,无需在后端编写任何鉴权代码,由云开发网关自动完成身份验证。

开启方式

  1. 登录云开发控制台,进入 HTTP 访问服务管理页面
  2. 在域名关联资源列表中,找到需要身份认证的路径
  3. 点击对应路径的「身份认证」开关,启用鉴权功能

开启后的访问行为

请求类型行为说明适用场景
浏览器直接访问系统自动跳转到登录页,登录成功后自动跳转回原页面用户在浏览器中打开链接
服务端 API 调用未携带有效鉴权信息的请求返回 MISSING_CREDENTIALS 错误码后端服务、脚本调用 API
Web 应用需要通过 Web SDK 获取 accessToken 并在请求头中携带前端 Web 应用调用 API

令牌类型

令牌类型适用环境用户权限有效期获取方式
Access Token客户端/服务端登录用户权限默认 2 小时通过 Web SDK 登录后获取
API Key仅服务端管理员权限长期有效云开发控制台 - API Key 管理页
Publishable Key客户端/服务端匿名用户权限长期有效云开发控制台 - API Key 管理页
重要提示
  • API Key 拥有管理员权限,严禁在客户端使用,仅用于服务端环境
  • Publishable Key 可以安全地暴露在浏览器中,用于请求公开访问的资源

Web 应用调用示例

import cloudbase from '@cloudbase/js-sdk';

// 初始化 SDK
const app = cloudbase.init({
env: 'your-env-id'
});
const auth = app.auth();

// 用户登录
await auth.signIn({
username: 'your username',
password: 'your password'
});

// 获取 accessToken
const { accessToken } = await auth.getAccessToken();

// 使用 fetch 发起带鉴权的 HTTP 请求
fetch('https://your-env-id.service.tcloudbase.com/api/function', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '云开发',
action: '测试鉴权'
})
})
.then(response => response.json())
.then(data => console.log('请求成功:', data));

服务端调用示例(Node.js)

const axios = require('axios');

// 使用 API Key 发起带鉴权的 HTTP 请求
axios({
url: 'https://your-env-id.service.tcloudbase.com/api/function',
method: 'post',
headers: {
'Authorization': `Bearer <APIKEY>`,
'Content-Type': 'application/json'
},
data: {
name: '云开发',
action: '测试鉴权'
}
})
.then(response => console.log('请求成功:', response.data));

后端获取用户信息

开启鉴权后,网关验证通过的请求会将用户信息通过请求头传递给后端服务:

// 云托管后端(无需编写鉴权逻辑)
app.get('/api/user', (req, res) => {
// 网关验证通过后,用户信息会自动注入到请求头
const cloudbaseContext = req.headers['x-cloudbase-context'];

if (cloudbaseContext) {
const context = JSON.parse(Buffer.from(cloudbaseContext, 'base64').toString());
res.json({
uid: context.uid
});
} else {
res.status(401).json({ error: '未登录' });
}
});

方案二:SDK 调用自动携带身份

当通过云开发 SDK 调用云托管时,请求会自动携带用户身份信息:

// 小程序端通过 SDK 调用云托管
const result = await wx.cloud.callContainer({
config: {
env: 'your-env-id'
},
path: '/api/user',
method: 'GET'
});

云托管服务可以从请求头中获取用户信息:

// 云托管后端
app.get('/api/user', (req, res) => {
// 从请求头获取用户信息
const openId = req.headers['x-wx-openid'];
const unionId = req.headers['x-wx-unionid'];
const cloudbaseContext = req.headers['x-cloudbase-context'];

if (cloudbaseContext) {
const context = JSON.parse(Buffer.from(cloudbaseContext, 'base64').toString());
console.log('用户 UID:', context.uid);
}

res.json({ openId, unionId });
});

方案三:自定义 Token 验证

如果需要自定义鉴权逻辑,可以在后端代码中手动验证 Token:

// Node.js (Express) 示例
const express = require('express');
const cloudbase = require('@cloudbase/node-sdk');

const app = express();
const tcbApp = cloudbase.init({
env: process.env.TCB_ENV
});

// 鉴权中间件
async function authMiddleware(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({ error: '未提供认证信息' });
}

const token = authHeader.substring(7);

try {
const auth = tcbApp.auth();
const userInfo = await auth.getUserInfoByAccessToken(token);

if (!userInfo || !userInfo.uid) {
return res.status(401).json({ error: 'Token 无效' });
}

req.user = userInfo;
next();
} catch (error) {
return res.status(401).json({ error: '认证失败' });
}
}

app.get('/api/user', authMiddleware, (req, res) => {
res.json({ uid: req.user.uid });
});

app.listen(80);

常用请求头说明

请求头说明
x-wx-openid微信用户 OpenID
x-wx-unionid微信用户 UnionID
x-cloudbase-contextBase64 编码的用户上下文信息

相似问题

  1. 云托管如何实现用户鉴权?
  2. 云托管怎么获取用户登录态?
  3. 如何在云托管中验证 JWT Token?
  4. 云托管服务如何识别当前用户?
  5. 小程序调用云托管如何传递用户信息?
  6. 云托管怎么获取微信 openid?
  7. 云开发身份认证 Token 如何在后端验证?
  8. 云托管 x-cloudbase-context 请求头怎么解析?
  9. HTTP 访问服务如何开启身份认证?
  10. Access Token 和 API Key 有什么区别?

相关文档