Firestore 安全规则 request.auth 始终为空

Firestore security rules request.auth is always null

我试图通过自定义声明加强 Firestore 的安全性,但没有成功。

版本:

我已经验证我的自定义声明已设置为某些 collections/requests,特别是来自 NextJs 服务器端渲染函数的预期工作。

我试过:

来自安全规则调试 - request.authnull

更新:

我从 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.