【问题标题】:Can User Create or Change Firebase Auth.uid?用户可以创建或更改 Firebase Auth.uid 吗?
【发布时间】:2021-05-30 18:19:18
【问题描述】:

我将在我的 Android 项目中使用 Firebase,我想使用 signInWithCustomToken 函数对用户进行身份验证。

我将从我的 Admin SDK(Python) 生成令牌并将其返回给用户,用户将使用该令牌进行身份验证。

我的问题是;

1 -> 我用密钥生成的令牌只能由我生成?我的意思是它对我来说是独一无二的吗?

uid = 'some-uid'

custom_token = auth.create_custom_token(uid)

如果有人使用相同的 uid 或者它总是唯一的,是否可以创建与我相同的令牌?

2 -> 有人可以手动设置 fireabase.auth.uid 变量,而不使用 firebase.authenticate 函数吗?

我的意思是如果有人得到了 auth.uid 而不是令牌,他可以将客户端中的 auth.uid 设置为 auth 变量吗?

感谢您的信息和回答...

【问题讨论】:

  • 你可能对这个答案感兴趣stackoverflow.com/a/66185640/3371862
  • 这不是我想要的。 Firebase 身份验证中禁用了我的所有登录方法。进行身份验证的唯一方法是使用我的自定义身份验证服务器构建与 Python 使用 Admin SDK。我使用自己的登录系统验证用户,如果用户验证我为该用户创建一个令牌并将其返回给用户。然后用户在 Android/Kotlin 中使用该令牌向 Firebase 进行身份验证。我要问的关键点是,有人可以在不使用我的身份验证服务器(1)的情况下重新生成/克隆该令牌吗?有人可以将他自己的 auth.uid 设置为他想要的值吗?感谢您的帮助和回答。
  • 正如文档中here 解释的那样,“自定义令牌是签名的 JWT,其中用于签名的私钥属于 Google 服务帐户”。这实际上是 R.S.下面解释。如果恶意用户尝试使用未使用此私钥签名的 JWT(具有现有 uid),则安全规则检查将失败。因此,您评论中两个问题的答案是否定的。
  • 所以如果我理解正确,没有人可以复制我创建的令牌,即使他们知道 uid,因为在创建该令牌时我用我的私钥对其进行签名。对于另一个问题,由于他们没有令牌,因此他们无法仅知道 uid 就可以向 firebase 进行身份验证。我说的对吗?
  • 是的,你是对的。 (当然,您有责任正确保护您的服务器和您的 Google 帐户)

标签: python android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

1 - 仅当有人获得您的 serviceCredentials 文件的访问权限时,才能复制自定义令牌,这意味着他们将拥有读/写您的 Firebase 内容的完全访问权限。如果您从不同的 Firebase 项目创建具有相同 UID 的令牌,则这些令牌将不匹配。

2 - 有人可能会尝试手动设置 auth.uid 变量,但是,如果没有身份验证令牌 its-self,这将毫无用处,它可以在数据库上进行读/写(取决于您的 Firebase 安全规则)。 Firebase 文档声明他们将生成身份验证令牌,如果没有您的 serviceCredentials 文件,这又一次无法完成。

【讨论】:

  • 我在想像这个例子一样设置我的数据库规则。 firebase.google.com/docs/database/security/… ".write": "$user_id === auth.uid" 还不够安全吗?你有什么建议?顺便说一句,您的第一个答案就是我正在寻找的答案,谢谢。
  • 数据库规则取决于您所处的环境。例如,如果您要设置一个只有选定成员可以编辑站点的组,则可能需要备用规则。您提到的案例是一个非常好的示例,可以适用于大多数情况,您提供的链接非常可靠,包含额外的信息。我还建议在您的后端执行检查,以获得更复杂的安全性,在到达 Firebase 之前在必要时防止“不允许”的操作;与使用纯 JS 相比,使用服务帐户意味着更多的访问权限,因此更容易受到攻击。
  • 我已经有一个 SQL 服务器来存储我几乎所有的应用程序数据,并且具有足够的控件。我将使用 Firebase 进行 FCM(推送通知)和实时数据库(用于用户存在)。所以我的情况并不复杂。我需要做的就是设置规则,只有用户自己可以将登录连接添加到他的路径,但每个用户都可以读取该路径。我给出的例子做了我想要的,我试过了。我试图确保没有人可以绕过它而不从我的身份验证服务器获取身份验证令牌。我希望,我解释了我的问题和担忧。
  • 对于#2 和 cmets:安全规则中的auth.uid 变量由 Firebase 确定,不能从客户端 SDK 进行欺骗。
猜你喜欢
  • 2017-10-20
  • 2016-09-10
  • 1970-01-01
  • 2021-05-18
  • 2021-12-27
  • 2014-06-20
相关资源
最近更新 更多