【发布时间】:2019-04-22 16:41:10
【问题描述】:
我有以下按预期工作的用例:
- 新用户到达网站
- 用户从 firebase 匿名登录获得
user.uid - 用户创建了一个文档,其中 userId 引用了上述
user.uid - 在同一页面上邀请用户登录,否则文档将丢失
- 用户登录后发现是账户文件
赢了!
现在我有一个未按预期工作的用例:
- 会话已过期或来自其他浏览器的返回用户到达网站
- 用户通过 firebase 匿名登录获得
user.uid - 用户创建了一个文档,其中 userId 引用了上述
user.uid - 在同一页面上邀请用户登录,否则文档将丢失
- 用户登录后没有找到帐户文档
这次没赢:(
我使用以下配置配置了 Firebase 身份验证:
const uiConfig = {
signInFlow: 'popup',
autoUpgradeAnonymousUsers: true,
signInOptions: [
firebase.auth.GoogleAuthProvider.PROVIDER_ID,
],
callbacks: {
signInFailure: (error: any) => {
if (error.code != 'firebaseui/anonymous-upgrade-merge-conflict') {
return Promise.resolve();
}
var cred = error.credential;
return firebase.auth().SignInAndRetrieveDataWithCredential(cred);
}
},
};
所以,如您所见,问题在于,第一次,autoUpgradeAnonymousUsers 使用匿名用户 ID 创建了一个新的 userId,一切都很好,但当然第二次不再起作用了。
鉴于我想在我的安全规则中创建一个检查 userId 无法更新并且只有具有相同 userId 的请求才能看到文档,我应该如何解决这个问题?
安全规则:
allow create: if request.auth.uid != null
allow read: if request.auth.uid == resource.data.userId
&& request.auth.uid != null
allow update: if request.auth.uid == request.resource.data.userId && resource.data.userId == request.resource.data.userId && request.auth.uid != null
谢谢。
【问题讨论】:
-
您在第二个用例中尝试实现什么?如果用户没有创建永久帐户,您想从第一个用例中恢复文档吗?
-
不,不是。我最初的想法是不要在第一次登录之前丢失 userId 信息。第二个用例是我没有想到的边缘案例。
-
嗯,我不明白为什么这不起作用。如果您匿名登录,您应该始终获得一个新的 uid。你能重现这种行为吗?你能展示更多你的代码吗?
-
如果您使用启用匿名登录时可用的 autoMerge 功能,则用户第一次进行身份验证时,匿名 uid 将用于登录用户,并且它们将是相同的。如果您注销并再次登录,那么用户 ID 当然会更改。实际上,这就是将匿名自动合并到登录用户所需的代码。您具体需要什么作为附加代码?
标签: firebase firebase-authentication google-cloud-firestore firebase-security