Stack Auth项目中的自定义用户数据管理指南
2025-07-07 07:43:05作者:秋泉律Samson
前言
在现代身份验证系统中,除了基本的用户认证信息外,通常还需要存储各种与用户相关的附加数据。Stack Auth项目提供了灵活的用户元数据管理机制,让开发者能够根据数据敏感性和访问需求,选择最适合的存储方式。
用户元数据类型概述
Stack Auth将用户元数据分为三类,每种类型针对不同的使用场景和安全需求:
- 客户端可读写元数据(clientMetadata) - 适合非敏感信息
- 服务器端元数据(serverMetadata) - 适合敏感信息
- 客户端只读元数据(clientReadOnlyMetadata) - 适合需要展示但不可修改的信息
客户端可读写元数据(clientMetadata)
适用场景
这种类型的元数据适合存储那些不包含敏感信息,且需要客户端和服务器都能读写的数据。例如:
- 用户偏好设置
- 个人资料基本信息
- 界面自定义选项
代码示例
// 更新客户端元数据
await user.update({
clientMetadata: {
themePreference: "dark",
language: "zh-CN",
notificationSettings: {
email: true,
sms: false
}
}
});
// 在客户端读取
const user = useUser();
console.log(user.clientMetadata.themePreference);
服务器端元数据(serverMetadata)
适用场景
这类元数据专为敏感信息设计,确保数据只能由服务器访问和修改。典型用例包括:
- 支付信息
- 身份验证凭证
- 内部系统标识符
代码示例
// 在服务器端更新敏感数据
const user = await stackServerApp.getUser();
await user.update({
serverMetadata: {
paymentToken: "secure_token_123",
internalRating: "VIP",
lastSecurityCheck: new Date().toISOString()
}
});
// 服务器端读取
const user = await stackServerApp.getUser();
console.log(user.serverMetadata.internalRating);
客户端只读元数据(clientReadOnlyMetadata)
适用场景
这类数据通常由服务器维护,但需要展示给客户端。常见应用场景:
- 用户会员等级
- 账户状态
- 系统计算得出的指标
代码示例
// 服务器端设置只读元数据
const user = await stackServerApp.getUser();
await user.update({
clientReadOnlyMetadata: {
accountStatus: "verified",
creditScore: 850,
loyaltyPoints: 1250
}
});
// 客户端读取(无法修改)
const user = useUser();
console.log(user.clientReadOnlyMetadata.accountStatus);
最佳实践建议
- 数据分类:根据数据敏感性明确分类,选择适当的元数据类型
- 最小权限原则:只授予必要的访问权限,减少安全风险
- 数据验证:服务器端应对所有写入操作进行验证
- 性能考虑:避免存储过大的数据对象,考虑使用专用存储服务
- 版本控制:对元数据结构变更做好版本管理
常见问题解答
Q: 能否在元数据中存储二进制数据? A: 虽然技术上可行,但不建议。对于大型二进制数据,应考虑使用专门的存储服务。
Q: 元数据是否有大小限制? A: Stack Auth对元数据大小有一定限制,具体取决于底层实现。建议保持元数据简洁,仅存储关键信息。
Q: 如何确保元数据的一致性? A: Stack Auth提供了原子更新操作,确保元数据修改的一致性。对于复杂事务,建议在服务器端实现。
通过合理利用Stack Auth提供的三种元数据类型,开发者可以构建既安全又灵活的用户数据管理系统,满足各种业务场景的需求。