类似于Uber,我有两个应用程序,一个是针对客户的,一个是针对司机的。是否有可能知道用户在登录时具有哪种角色类型?例如,如果我有一个客户端帐户,并且我试图登录驱动程序的应用程序,我应该得到一个错误:“不能使用客户端帐户登录驱动程序应用程序”。
假设我将用户的帐户类型(驱动程序或客户端)存储在自定义的auth声明中,那么在firebase auth验证电子邮件和密码时是否可以访问它,或者用户必须成功登录才能验证自定义auth声明的值?
本质上,如果用户尝试登录错误的应用程序,我希望它作为一个错误返回,而不实际登录它们。到目前为止,我只能在用户使用getIDTokenResult登录之后才能检查这一点。
如有任何帮助,将不胜感激!)
发布于 2021-07-16 05:36:27
本质上说,如果用户尝试登录错误的应用程序,我希望它作为一个错误返回,而不实际登录它们。
您似乎正在将身份验证(用户输入证明他们是谁的凭据)与授权(允许用户根据他们是谁做某些事情)混合在一起。Firebase身份验证只与前者有关:允许用户在输入正确的帐户凭据后登录。一旦用户被登录,您的应用程序代码就可以确定它们是否允许执行某些操作。
例如,对于特定的用例,惯用的方法是:
正如您在这里看到的,处理所有授权逻辑的是您的应用程序逻辑,而Firebase负责身份验证。
发布于 2021-07-15 18:51:30
用户必须在签入声明之前登录,而且如果是同一个防火墙项目,您也不能阻止任何人登录。您应该在登录后检查声明,如果用户登录错误的应用程序,只需强制他们注销。安全规则可用于防止未经授权的访问。
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 )中可能没有用。
虽然我不建议仅仅在用户登录之前使用云函数来检查声明,因为就像前面提到的那样,用户登录之前可以绕过它,因此强制用户退出就足够了。但是这里有一个云函数,您可以使用它来检查声明。
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}`)
}
});同样,正如上面提到的,这听起来有点过火,但是如果有必要或者您更喜欢这样做,那么就使用这个函数。
https://stackoverflow.com/questions/68399226
复制相似问题