Firestore 安全规则 request.auth 始终为空
Firestore security rules request.auth is always null
我试图通过自定义声明加强 Firestore 的安全性,但没有成功。
版本:
- Firebase:^9.6.9
- 节点:16.14.0
- 下一个:11.1.0
我已经验证我的自定义声明已设置为某些 collections/requests,特别是来自 NextJs 服务器端渲染函数的预期工作。
我试过:
- 将每个服务重构为 Firebase V9,而不是使用兼容。
- 更改生产中的 Firestore 规则
- 设置模拟器(注意*我没有使用 auth 模拟器)
- 将 debug() 添加到安全规则
- 注销并重新登录
request.auth.token
(调试在其他请求中显示的内容)
- 以及
request.resource.auth.token
根据 These Docs(不正确的用法)
来自安全规则调试 - request.auth
是 null
更新:
我从 firebase 控制台上的规则使用情况中看到,这些规则被视为 错误 并且 未拒绝 。
我发现了奇怪的行为。
除了 'blog'.
,我可以成功地为任何集合使用自定义声明
规则匹配标签成功:
我开始认为它与 NextJs 服务器端渲染 使用 getServerSideProps()
有关
我检索博客条目的代码:
export async function getServerSideProps(context) {
const posts: BlogPost[] | any = await GetBlogPosts();
return {
props: {posts}, // will be passed to the page component as props
};
}
interface extendedBlogPosts extends BlogPost {
['key']: string;
id: string;
}
interface BlogPageProps {
posts: extendedBlogPosts[];
userProps: {user: UserInfo; userData: UserData};
}
当前用户信息存储在 request.auth
中,而不是您在第一个和最后一个屏幕截图中使用的 request.resource.auth
。
这听起来像是 getServerSideProps
运行 中的代码在受信任的环境中使用 Admin SDK 访问 Firestore。如果是这种情况,那么您看到的行为是意料之中的,因为 Admin SDK 以 elevated/administrative 权限访问数据库,而不是作为特定用户访问数据库,并绕过所有安全规则。
即使您没有使用 Admin SDK,如果服务器中的代码 运行s 使用常规 JavaScript SDK(或 Node.js 的代码,但不是用于管理用途),您的代码在与用户登录的环境不同的环境中执行。因此,除非您也将用户登录到 server-side 代码,否则它将 运行 没有登录用户,因此您规则中的 request.auth
变量将是 null
.
我试图通过自定义声明加强 Firestore 的安全性,但没有成功。
版本:
- Firebase:^9.6.9
- 节点:16.14.0
- 下一个:11.1.0
我已经验证我的自定义声明已设置为某些 collections/requests,特别是来自 NextJs 服务器端渲染函数的预期工作。
我试过:
- 将每个服务重构为 Firebase V9,而不是使用兼容。
- 更改生产中的 Firestore 规则
- 设置模拟器(注意*我没有使用 auth 模拟器)
- 将 debug() 添加到安全规则
- 注销并重新登录
request.auth.token
(调试在其他请求中显示的内容)- 以及
request.resource.auth.token
根据 These Docs(不正确的用法)
来自安全规则调试 - request.auth
是 null
更新:
我从 firebase 控制台上的规则使用情况中看到,这些规则被视为 错误 并且 未拒绝 。
我发现了奇怪的行为。
除了 'blog'.
,我可以成功地为任何集合使用自定义声明规则匹配标签成功:
我开始认为它与 NextJs 服务器端渲染 使用 getServerSideProps()
我检索博客条目的代码:
export async function getServerSideProps(context) {
const posts: BlogPost[] | any = await GetBlogPosts();
return {
props: {posts}, // will be passed to the page component as props
};
}
interface extendedBlogPosts extends BlogPost {
['key']: string;
id: string;
}
interface BlogPageProps {
posts: extendedBlogPosts[];
userProps: {user: UserInfo; userData: UserData};
}
当前用户信息存储在 request.auth
中,而不是您在第一个和最后一个屏幕截图中使用的 request.resource.auth
。
这听起来像是 getServerSideProps
运行 中的代码在受信任的环境中使用 Admin SDK 访问 Firestore。如果是这种情况,那么您看到的行为是意料之中的,因为 Admin SDK 以 elevated/administrative 权限访问数据库,而不是作为特定用户访问数据库,并绕过所有安全规则。
即使您没有使用 Admin SDK,如果服务器中的代码 运行s 使用常规 JavaScript SDK(或 Node.js 的代码,但不是用于管理用途),您的代码在与用户登录的环境不同的环境中执行。因此,除非您也将用户登录到 server-side 代码,否则它将 运行 没有登录用户,因此您规则中的 request.auth
变量将是 null
.