ionic, firebase: como obter TODOS os e-mails do usuário a partir do Firebase Authentication

Dec 28 2020

Estou tentando obter o e-mail do usuário de TODOS os usuários que estão em meu armazenamento de autenticação do Firebase. Preciso dessas informações para permitir que os usuários enviem mensagens uns aos outros no sistema. Eu não sou muito experiente com ionic então me perdoe se é uma pergunta estúpida. Não preciso do e-mail dos usuários logados, já tenho acesso a ele, mas estou tendo problemas para acessar todos eles.

código de login, não tenho certeza se exatamente necessário.

// login.page.ts
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms';
import { NavController } from '@ionic/angular';
import { AuthenticationService } from '../services/authentication.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.page.html',
  styleUrls: ['./login.page.scss'],
})
export class LoginPage implements OnInit {

  validations_form: FormGroup;
  errorMessage: string = '';

  constructor(

    private navCtrl: NavController,
    private authService: AuthenticationService,
    private formBuilder: FormBuilder

  ) { }

  ngOnInit() {

    this.validations_form = this.formBuilder.group({
      email: new FormControl('', Validators.compose([
        Validators.required,
        Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$')
      ])),
      password: new FormControl('', Validators.compose([
        Validators.minLength(5),
        Validators.required
      ])),
    });
  }


  validation_messages = {
    'email': [
      { type: 'required', message: 'Email is required.' },
      { type: 'pattern', message: 'Please enter a valid email.' }
    ],
    'password': [
      { type: 'required', message: 'Password is required.' },
      { type: 'minlength', message: 'Password must be at least 5 characters long.' }
    ]
  };


  loginUser(value) {
    this.authService.loginUser(value)
      .then(res => {
        console.log(res);
        this.errorMessage = "";
        this.navCtrl.navigateForward('/welcome');
      }, err => {
        this.errorMessage = err.message;
      })
  }

  goToRegisterPage() {
    this.navCtrl.navigateForward('/register');
  }

}

código de registro

// register.page.ts
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms';
import { AuthenticationService } from '../services/authentication.service';
import { NavController } from '@ionic/angular';

@Component({
  selector: 'app-register',
  templateUrl: './register.page.html',
  styleUrls: ['./register.page.scss'],
})
export class RegisterPage implements OnInit {


  validations_form: FormGroup;
  errorMessage: string = '';
  successMessage: string = '';

  validation_messages = {
    'email': [
      { type: 'required', message: 'Email is required.' },
      { type: 'pattern', message: 'Enter a valid email.' }
    ],
    'password': [
      { type: 'required', message: 'Password is required.' },
      { type: 'minlength', message: 'Password must be at least 5 characters long.' }
    ]
  };

  constructor(
    private navCtrl: NavController,
    private authService: AuthenticationService,
    private formBuilder: FormBuilder
  ) { }

  ngOnInit() {
    this.validations_form = this.formBuilder.group({
      email: new FormControl('', Validators.compose([
        Validators.required,
        Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$')
      ])),
      password: new FormControl('', Validators.compose([
        Validators.minLength(5),
        Validators.required
      ])),
    });
  }

  tryRegister(value) {
    this.authService.registerUser(value)
      .then(res => {
        console.log(res);
        this.errorMessage = "";
        this.successMessage = "Your account has been created. Please log in.";
      }, err => {
        console.log(err);
        this.errorMessage = err.message;
        this.successMessage = "";
      })
  }

  goLoginPage() {
    this.navCtrl.navigateForward('/login');
  }


}

o que estou tentando conseguir seria algo como

  1. o usuário clica em uma lista / opções
  2. o usuário escolhe um e-mail
  3. digita qualquer conteúdo de mensagem que ele / ela deseja compartilhar, eu compartilharei um pequeno trecho
<ion-select>
    <ion-select-option value="email1">email1</ion-select-option>
    <ion-select-option value="email2">email2</ion-select-option>
    <ion-select-option value="email3">email3</ion-select-option>
    <ion-select-option value="email4">email4/ion-select-option>
  </ion-select> //probably will use *ngFor to do this.

captura de tela do serviço de autenticação

Respostas

FrankvanPuffelen Dec 28 2020 at 00:42

O SDK do Firebase Authentication do lado do cliente não tem como obter os endereços de e-mail de todos os usuários do sistema, pois isso seria um risco de segurança potencial.

Se seu aplicativo precisa dessa funcionalidade, você terá que criá-la sozinho. As duas opções mais comuns são:

  1. Implemente uma API personalizada do lado do servidor que usa o SDK Admin do Firebase, que tem essa funcionalidade.
  2. Armazene os dados de usuário necessários em um banco de dados, como o Realtime Database do Firebase ou o Cloud Firestore, e permita que o cliente os acesse lá.

Em ambos os casos, seu aplicativo controla quais dados são expostos sobre seus usuários, o que aborda a questão de segurança.

Veja também:

  • Recuperar uma lista de usuários que se registraram usando Firebase Auth
  • Obtenha uma lista de endereços de e-mail de usuários com AngularFire
  • Como buscar todos os e-mails de autenticação registrados no Firebase