首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在登录时验证自定义声明?

如何在登录时验证自定义声明?
EN

Stack Overflow用户
提问于 2021-07-15 18:41:47
回答 2查看 148关注 0票数 0

类似于Uber,我有两个应用程序,一个是针对客户的,一个是针对司机的。是否有可能知道用户在登录时具有哪种角色类型?例如,如果我有一个客户端帐户,并且我试图登录驱动程序的应用程序,我应该得到一个错误:“不能使用客户端帐户登录驱动程序应用程序”。

假设我将用户的帐户类型(驱动程序或客户端)存储在自定义的auth声明中,那么在firebase auth验证电子邮件和密码时是否可以访问它,或者用户必须成功登录才能验证自定义auth声明的值?

本质上,如果用户尝试登录错误的应用程序,我希望它作为一个错误返回,而不实际登录它们。到目前为止,我只能在用户使用getIDTokenResult登录之后才能检查这一点。

如有任何帮助,将不胜感激!)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-16 05:36:27

本质上说,如果用户尝试登录错误的应用程序,我希望它作为一个错误返回,而不实际登录它们。

您似乎正在将身份验证(用户输入证明他们是谁的凭据)与授权(允许用户根据他们是谁做某些事情)混合在一起。Firebase身份验证只与前者有关:允许用户在输入正确的帐户凭据后登录。一旦用户被登录,您的应用程序代码就可以确定它们是否允许执行某些操作。

例如,对于特定的用例,惯用的方法是:

  1. 将用户登录到Firebase
  2. ,无论他们的令牌是否包含他们试图使用的应用程序的必要声明。如果是的话,允许他们继续使用应用程序的主屏幕。如果没有,请告知他们事实,不允许他们继续使用。

正如您在这里看到的,处理所有授权逻辑的是您的应用程序逻辑,而Firebase负责身份验证。

票数 1
EN

Stack Overflow用户

发布于 2021-07-15 18:51:30

用户必须在签入声明之前登录,而且如果是同一个防火墙项目,您也不能阻止任何人登录。您应该在登录后检查声明,如果用户登录错误的应用程序,只需强制他们注销。安全规则可用于防止未经授权的访问。

代码语言:javascript
复制
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 )中可能没有用。

虽然我不建议仅仅在用户登录之前使用云函数来检查声明,因为就像前面提到的那样,用户登录之前可以绕过它,因此强制用户退出就足够了。但是这里有一个云函数,您可以使用它来检查声明。

代码语言:javascript
复制
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方法之前调用函数。

代码语言:javascript
复制
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}`)
    }
  });

同样,正如上面提到的,这听起来有点过火,但是如果有必要或者您更喜欢这样做,那么就使用这个函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68399226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档