云托管与身份认证服务如何结合使用
云托管服务可以与云开发的身份认证服务结合,实现用户登录态的验证和管理。本文介绍推荐的集成方案。
集成方案概述
云托管与身份认证的集成主要有以下几种方式:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 开启 HTTP 身份认证(推荐) | 在 HTTP 访问服务中开启身份认证,网关自动验证 | 最简便的鉴权方式 |
| SDK 调用自动携带身份 | 通过 SDK 调用时自动传递用户信息 | 小程序/Web SDK 调用 |
| 自定义 Token 验证 | 后端代码验证 Token | 需要自定义鉴权逻辑 |
方案一:开启 HTTP 身份认证(推荐)
这是最简便的鉴权方式,无需在后端编写任何鉴权代码,由云开发网关自动完成身份验证。
开启方式
- 登录云开发控制台,进入 HTTP 访问服务管理页面
- 在域名关联资源列表中,找到需要身份认证的路径
- 点击对应路径的「身份认证」开关,启用鉴权功能
开启后的访问行为
| 请求类型 | 行为说明 | 适用场景 |
|---|---|---|
| 浏览器直接访问 | 系统自动跳转到登录页,登录成功后自动跳转回原页面 | 用户在浏览器中打开链接 |
| 服务端 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-context | Base64 编码的用户上下文信息 |
相似问题
- 云托管如何实现用户鉴权?
- 云托管怎么获取用户登录态?
- 如何在云托管中验证 JWT Token?
- 云托管服务如何识别当前用户?
- 小程序调用云托管如何传递用户信息?
- 云托管怎么获取微信 openid?
- 云开发身份认证 Token 如何在后端验证?
- 云托管 x-cloudbase-context 请求头怎么解析?
- HTTP 访问服务如何开启身份认证?
- Access Token 和 API Key 有什么区别?