如何防止用户更改密码后阅读?
Posted
技术标签:
【中文标题】如何防止用户更改密码后阅读?【英文标题】:How to prevent user from reading after password change? 【发布时间】:2021-08-28 14:09:45 【问题描述】:在我的firebase realtime database
中,只有经过身份验证的用户才能读取数据。假设用户(假设xyz
)在应用程序中是logged in
,我重置了他的密码。重置/更改密码后,xyz
仍然能够在数据库中读取/写入,直到我重新验证并手动注销他(通过代码)。问题是,如果有人修改应用程序源代码并删除手动注销部分,我如何防止该用户读取/写入数据库?
【问题讨论】:
【参考方案1】:您可以通过使用新密码调用云函数来做到这一点,我建议对密码进行编码和解码,但这超出了本问题的范围。
// declare function
exports.updatePass= functions.https.onCall((data, context) =>
return admin
.auth()
.updateUser(context.auth.uid, password: 'newPassword' )
.then(async (userRecord) =>
const utcRevocationTimeSecs = await new Date(userRecord.tokensValidAfterTime).getTime() / 1000;
return admin.database().ref('metadata/' + uid)
.set( revokeTime: utcRevocationTimeSecs ))
.then(() => admin.auth().revokeRefreshTokens(context.auth.uid))
.then(() => return message: "success";
.catch((error) =>
return error;
);
);
这会将更改写入实时数据库,您可以收听更改并在您的安全规则中使用,如果需要,这可以轻松地将其换成 firestore。
"rules":
"metadata":
"$user_id":
// this could be false as it is only accessed from backend or rules.
".read": "$user_id === auth.uid",
".write": "false",
来源:
https://firebase.google.com/docs/auth/admin/manage-users#update_a_user https://firebase.google.com/docs/auth/admin/manage-sessions【讨论】:
这个答案有三个严重的错误:它需要优雅地检查用户是否已登录(当前抛出null
的无法读取的属性),该用户是否已登录/最近重新进行了身份验证,以及他们是否快速连续发送了多个密码更改。
我目前正在使用免费计划。所以我无法检查您的代码是否有效。不过感谢您的帮助【参考方案2】:
Firebase 身份验证基于令牌,其短寿命(ID 令牌)有效期为一小时。更改帐户密码不会使现有 ID 令牌无效,因此如果您希望用户立即失去访问权限,则必须以其他方式执行此操作。
一种常见的方法是在数据库中保留一个禁止列表/阻止列表,用于应该被阻止的 UID,即使它们具有有效的 ID 令牌。这个场景在detecting ID token revocation 的文档中有更完整的描述。
不过,使用这种方法,您无法明确触发何时取消阻止/重新启用用户的访问权限,因为当他们的密码更改时没有回调。我能想到的最好方法是定期运行云函数来检查用户的密码哈希是否已更改,但我希望有人为此步骤提供更好的选择。
【讨论】:
嘿弗兰克,这可以通过云功能完成,在 admin sdk 中重置密码并撤销 idtoken 可能是最好的选择。用户很可能必须重新进行身份验证 好一个。 ? 使用 Cloud Functions 执行实际的密码更改,意味着您确实可以知道它何时发生并在那时删除块。以上是关于如何防止用户更改密码后阅读?的主要内容,如果未能解决你的问题,请参考以下文章