我已经使用通过电子邮件链接登录Firebase设置了无密码登录。一切都按预期工作,但是当用户收到电子邮件并单击登录链接时,他们会自动创建为注册用户。
https://firebase.google.com/docs/auth/web/email-link-auth
用户首次登录后,新的用户帐户 已创建并链接到凭据...
这意味着在登录屏幕中提出请求的任何人都会收到一封电子邮件并可以访问该网站。
我不确定是否需要完成任何配置或设置,以要求仅针对已注册的用户检查请求注册链接的用户。
类似的东西
firebase.auth().sendLoginLinkToEmail(email,{url:...,handleCodeInApp:true}).then(() =>{
....
}, error =>{
// return if not an authenticated user
})
如果email
未注册,则返回错误。
这个想法是让管理员创建用户,然后这些创建的用户只需使用电子邮件链接登录(没有密码(
这可能吗?为了防止Firebase使用.signInWithEmailLink()
创建帐户?
无密码电子邮件登录允许用户证明他们有权访问某个邮箱。它本质上只做这些事情。用户单击链接后,将进行身份验证。除了启用/禁用整个登录提供程序之外,您无法控制谁可以登录/进行身份验证。
之后,由您的应用程序确定允许此用户执行的操作。这是一个单独的步骤,通常称为授权。
Firebase 身份验证(顾名思义(仅负责身份验证。您必须在其他地方处理授权,具体取决于您为用户提供访问权限的服务。
是什么让电子邮件在您的应用中"注册"? 即管理员在哪里创建这些用户?例如,如果您将用户存储在 Cloud Firestore 的集合allowed_users
中,则使用如下文档:
allowed_users: // collection
"arkade@domain,com": { ... } // document
"puf@domain,com": { ... } // document
现在,您可以使用 Firestore 的服务器端安全规则限制只有允许的用户才能访问其他数据。假设您有一个posts
集合,您可以只允许这些用户阅读以下内容的帖子:
service cloud.firestore {
match /databases/{database}/documents {
match /posts/{post} {
// Make sure a 'allowed_users' document exists for the requesting user before
// allowing any reads from the 'posts' collection
allow read: if exists(/databases/$(database)/documents/allowed_users/$(request.auth.email))
}
}
语法有点长,但您可以看到,仅当当前用户的电子邮件地址(request.auth.email
(作为allowed_users
中的文档存在时,才允许阅读帖子。
在 Firestore 规则的规则版本 2 中,访问当前用户的电子邮件地址的方式略有不同。您可以通过request.auth.token.email
.下面的示例还演示了如何get
当前用户文档中的布尔属性(如果您通过电子邮件标识该用户(:
allow write: if get(/databases/$(database)/documents/users/$(request.auth.token.email)).data.admin == true;