与 Uber 类似,我有两个应用程序,一个用于客户,一个用于司机。是否可以知道用户在登录时具有哪种角色类型?例如,如果我有一个客户帐户并且我尝试登录驱动程序的应用程序,我应该收到错误消息:“客户帐户不能用于登录驱动程序应用程序”。
假设我将用户的帐户类型(驱动程序或客户端)存储在自定义身份验证声明中,是否可以在 firebase 身份验证验证电子邮件和密码时访问它,或者用户是否必须在我之前成功登录可以验证自定义身份验证声明的值吗?
本质上,如果用户尝试登录错误的应用程序,我希望它在没有实际登录的情况下作为错误返回。到目前为止,我只能在用户使用 {{ 1}}。
感谢任何帮助! :)
答案 0 :(得分:0)
用户必须在检查声明之前登录,无论如何,如果它是同一个 firebase 项目,你不能阻止任何人登录。您应该在登录后检查声明,如果用户登录了错误的应用程序,只需强制他们注销即可。安全规则可用于防止未经授权的访问。
firebase.auth().signInWithEmailAndPassword().then(async ({user}) => {
const claims = await user.getIdTokenResult()
// check for claim
// if not valid then logout or redirect to relevant pages
await firebase.auth(can ).signOut()
})
您可以在退出后显示错误提示。
如果您真的想在用户登录之前检查声明,则必须使用云功能来检查输入的电子邮件的声明,但此方法在其他登录提供商(例如 Google 或 Facebook)中可能没有用。< /p>
虽然我不建议使用 Cloud 函数只是为了在用户登录前检查声明,因为它可以在前端绕过,如上所述,强制用户注销应该就足够了。但这里有一个云功能,您可以使用它来检查声明。
exports.checkClaim = functions.https.onCall((data, context) => {
const {email} = data;
return admin
.auth()
.getUser(uid)
.then((userRecord) => {
const {customClaims: {driver, client}} = userRecord;
if (driver) return {role: "driver"}
if (client) return {role: "client"}
return {error: "No role found"}
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
});
然后在运行 signInWithEmailAndPassword
方法之前调用该函数。
const checkUserRole = firebase.functions().httpsCallable('checkClaim');
checkUserRole({ email: "user@domain.tld" })
.then((result) => {
const {role, error} = result;
if (error) {
alert("Something went wrong. No roles found")
} else {
console.log(`Your role is: ${role}`)
}
});
再次如上所述,这听起来有点矫枉过正,但如果有必要或者您更喜欢这样做,那么您可以使用此功能。
答案 1 :(得分:0)
本质上,如果用户尝试登录错误的应用程序,我希望它在没有实际登录的情况下作为错误返回。
您似乎将身份验证(用户输入证明其身份的凭据)与授权(允许用户根据身份做某些事情)混合使用。 Firebase 身份验证只关注前者:允许用户在输入正确的帐户凭据后登录。用户登录后,您的应用程序代码就可以确定是否允许他们执行某些操作。
例如,对于您的特定用例,惯用的方法是:
正如您在此处看到的,您的应用程序逻辑负责处理所有授权逻辑,而 Firebase 负责身份验证。