如何将凭据存储到本地存储以允许Firebase身份验证登录

我需要知道

我正在Angular 10项目中工作,也正在使用Firebase托管和Cloud Firestore(用于DB)。我也在我的项目中使用AngularFire。

我的项目已经能够从Firestore集合中获取文档并显示它们(也可以编辑,删除和创建它们)。我还设置了身份验证,使用AngularFireAuth登录和注销。我也有路由防护,仅允许用户登录后访问信息。

我发现Firestore也有规则,您应该设置规则以保护您的收藏。目前,我基本上没有规则(测试模式),但是我想添加一个基本的“只有用户可以访问任何内容”规则,但是遇到了问题。

我认为这是问题,目前,登录我的应用程序后,会将用户存储在本地存储中。我认为我需要以其他方式存储它,以便从先前给出的凭据重新登录,而不是仅检查是否存在本地存储。只有ERROR FirebaseError: Missing or insufficient permissions当我的保安检查本地存储以确保登录时,我才会收到错误消息,如果我先登录,则不会收到该错误消息。

因此,我应该如何保存用户数据,这样就不必每次刷新时都登录,而是可以验证对Firebase的身份验证?我知道我可以将电子邮件/密码存储到本地存储中,然后检查以重新登录,但这对我来说并不安全。

我认为以上是问题,但不是100%肯定。

这是我的Firestore规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  allow read, write: if request.auth != null
    match /{document=**} {
      allow read, write: if request.auth != null //should only allow users?
    }
  }
}

这是我的身份验证服务(我在其中处理登录/注销,并检查本地存储中是否有用户。

export class AuthService {
  constructor(private aFAuth: AngularFireAuth, public router: Router) {
    //I honestly don't know if I need this
    this.aFAuth.authState.subscribe((user) => {
      if (user) {
        localStorage.setItem('my-test-app-currentUser', JSON.stringify(user));
      } else {
        localStorage.setItem('my-test-app-currentUser', null);
      }
    });
  }

  async signIn(email: string, password: string) {
    this.aFAuth
      .signInWithEmailAndPassword(email, password).then((result) => {
        localStorage.setItem('my-test-app-currentUser', JSON.stringify(result.user));
        this.router.navigate(['']);
      }).catch((error) => {
        window.alert(error.message);
      });
  }

//this is the func that needs to change, if I have storage, I need to be able to sign-in with it again
  isSignedIn(): boolean {
    if (!localStorage.getItem('my-test-app-currentUser')) {
      return false;
    }
    return true;
  }

  signOut() {
    return this.aFAuth.signOut().then(() => {
      localStorage.removeItem('my-test-app-currentUser');
      window.alert('You have been signed-out');
    });
  }
}

这是我的警卫:

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    // return true;
    if (this.auth.isSignedIn()) {
      return true;
    } else {
      this.router.navigate(["sign-in"]);
      return false;
    }
  }

任何帮助,将不胜感激。

弗兰克·范普菲伦

Firebase已经将用户凭据存储在本地存储中,并在您重新加载页面时自动将其还原。

还原它们确实需要对服务器进行检查,因此它是异步发生的。因此,任何依赖于用户身份验证状态的代码都应位于 this.aFAuth.authState.subscribe处理程序内部,以便只要身份验证状态发生更改,代码便会运行。

因此signInWithEmailAndPassword,导航应该在auth侦听器中进行,而不是在调用完成时处理导航(仅当您主动登录用户时才发生导航),导航既可以在活动登录时又可以在还原时运行。

所以像:

export class AuthService {
  constructor(private aFAuth: AngularFireAuth, public router: Router) {
    //I honestly don't know if I need this
    this.aFAuth.authState.subscribe((user) => {
      if (user) {
        localStorage.setItem('my-test-app-currentUser', JSON.stringify(user));
        this.router.navigate(['']);
      } else {
        localStorage.setItem('my-test-app-currentUser', null);
      }
    });
  }

  async signIn(email: string, password: string) {
    this.aFAuth
      .signInWithEmailAndPassword(email, password).then((result) => {
        window.alert(error.message);
      });
  }
  ...

在您中,canActivate您可能需要使用AngularFireAuthGuard这样可以确保未经身份验证的用户不允许导航到受保护的路由。我认为这可能会取代您对本地存储的全部需求。

另请参阅“ Firebase身份验证入门”和“使用AngularFire防护路由用户”中的AngularFire文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将Windows身份验证凭据从客户端传递到Web API服务

来自分类Dev

Thymeleaf Spring Security-将身份验证存储到本地变量

来自分类Dev

linux(redhat)本地身份验证存储库重定向到LDAP身份验证

来自分类Dev

如何存储要通过Firebase简单登录电子邮件/密码进行身份验证的用户?

来自分类Dev

如何将已通过身份验证的用户从登录页面重定向到主页

来自分类Dev

如何将未经身份验证的用户重定向到登录视图

来自分类Dev

如何将Firebase存储项目存储到本地缓存中以节省带宽成本?

来自分类Dev

如何将网络凭据从PEAP身份验证的计算机复制到新的PC

来自分类Dev

REST服务身份验证:在哪里存储用户凭据?

来自分类Dev

Firebase身份验证令牌的存储

来自分类Dev

如何将输入多次存储到本地存储中

来自分类Dev

将本地存储库推送到具有双重身份验证的GitHub存储库

来自分类Dev

完成Firebase身份验证后,如何将数据发布到signInSuccessUrl?

来自分类Dev

如何在Google App Engine中安全存储外部身份验证凭据

来自分类Dev

如何在 ruby 客户端脚本中安全地存储身份验证凭据?

来自分类Dev

如何将FireBase身份验证用于SSO

来自分类Dev

如何将密码安全地存储在MySQL中并通过外部服务进行身份验证

来自分类Dev

条带身份验证存储

来自分类Dev

将文件上传到Firebase存储时出现身份验证错误

来自分类Dev

无用户凭据的Firebase身份验证

来自分类Dev

使用Google Firebase存储而不进行身份验证

来自分类Dev

Firebase:在Cookie中存储匿名身份验证

来自分类Dev

Firebase身份验证:令牌存储在Web的何处?

来自分类Dev

Firebase:在Cookie中存储匿名身份验证

来自分类Dev

Firebase身份验证-登录,然后重定向到应用程序-如何获取用户

来自分类Dev

如何将本地用户转换为针对LDAP目录进行身份验证?

来自分类Dev

如何将本地用户转换为针对 LDAP 目录进行身份验证?

来自分类Dev

通过Google+进行身份验证时,在会话中存储OAuth凭据时出错

来自分类Dev

如何将JSON数据存储和检索到本地存储中?

Related 相关文章

  1. 1

    如何将Windows身份验证凭据从客户端传递到Web API服务

  2. 2

    Thymeleaf Spring Security-将身份验证存储到本地变量

  3. 3

    linux(redhat)本地身份验证存储库重定向到LDAP身份验证

  4. 4

    如何存储要通过Firebase简单登录电子邮件/密码进行身份验证的用户?

  5. 5

    如何将已通过身份验证的用户从登录页面重定向到主页

  6. 6

    如何将未经身份验证的用户重定向到登录视图

  7. 7

    如何将Firebase存储项目存储到本地缓存中以节省带宽成本?

  8. 8

    如何将网络凭据从PEAP身份验证的计算机复制到新的PC

  9. 9

    REST服务身份验证:在哪里存储用户凭据?

  10. 10

    Firebase身份验证令牌的存储

  11. 11

    如何将输入多次存储到本地存储中

  12. 12

    将本地存储库推送到具有双重身份验证的GitHub存储库

  13. 13

    完成Firebase身份验证后,如何将数据发布到signInSuccessUrl?

  14. 14

    如何在Google App Engine中安全存储外部身份验证凭据

  15. 15

    如何在 ruby 客户端脚本中安全地存储身份验证凭据?

  16. 16

    如何将FireBase身份验证用于SSO

  17. 17

    如何将密码安全地存储在MySQL中并通过外部服务进行身份验证

  18. 18

    条带身份验证存储

  19. 19

    将文件上传到Firebase存储时出现身份验证错误

  20. 20

    无用户凭据的Firebase身份验证

  21. 21

    使用Google Firebase存储而不进行身份验证

  22. 22

    Firebase:在Cookie中存储匿名身份验证

  23. 23

    Firebase身份验证:令牌存储在Web的何处?

  24. 24

    Firebase:在Cookie中存储匿名身份验证

  25. 25

    Firebase身份验证-登录,然后重定向到应用程序-如何获取用户

  26. 26

    如何将本地用户转换为针对LDAP目录进行身份验证?

  27. 27

    如何将本地用户转换为针对 LDAP 目录进行身份验证?

  28. 28

    通过Google+进行身份验证时,在会话中存储OAuth凭据时出错

  29. 29

    如何将JSON数据存储和检索到本地存储中?

热门标签

归档