Angular2 Firebase Получить текущего пользователя

Я действительно изо всех сил пытаюсь понять, как получить текущий идентификатор пользователя, вошедшего в систему, и отфильтровать список по этому идентификатору пользователя.

Я могу достаточно легко получить идентификатор пользователя, но он, похоже, недоступен во время звонка, чтобы получить список клиентов.

Если бы кто-то мог помочь или указать мне в правильном направлении, это было бы очень признательно.

Служба аутентификации

import { Injectable } from "@angular/core";
import { AngularFire, AuthProviders, AuthMethods, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2';
import { UserModel } from '../users/models/user.model';

@Injectable()
export class AuthenticationService {

  public displayName: string;
  public userKey: string;
  public user: UserModel;

  constructor(public af: AngularFire) {
    this.af.auth.subscribe(
      (auth) => {
        if (auth != null) {
          this.user = this.af.database.object('users/' + auth.uid);
          this.userKey = auth.uid;
        }
      });
  }

  logout() {
    return this.af.auth.logout();
  }

  loginWithEmail(email, password) {
    return this.af.auth.login({
      email: email,
      password: password,
    },
      {
        provider: AuthProviders.Password,
        method: AuthMethods.Password,
      });
  }
}

Обслуживание клиентов

import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { AngularFire, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2';

import { AuthenticationService } from '../authentication/authentication.service';

import { CustomerModel } from './models/customer.model';

@Injectable()
export class CustomersService {

  customersRef: string = '/customers/';
  customer: any;
  usersCustomerId: string;

  constructor(
    private af: AngularFire,
    private authService: AuthenticationService,
    private router: Router) { }

  getAllCustomers(): FirebaseListObservable<CustomerModel[]> {

    this.usersCustomerId = this.authService.userKey;
    console.log(this.usersCustomerId);

    return this.af.database.list(this.customersRef, {
      query: {
        orderByChild: 'uid',
        equalTo: this.usersCustomerId
      }
    });
  }
}

person ccocker    schedule 06.02.2017    source источник


Ответы (4)


Пакет AngularFire2 устарел. Вместо этого используйте @angular/fire. Я использую следующий код в своем сервисе и компоненте.

сервисный файл auth.service.ts

authState: any = null;

constructor(
  private firebaseAuth: AngularFireAuth,
) {
  this.firebaseAuth.authState.subscribe( authState => {
    this.authState = authState;
  });
} 

проверить, аутентифицирован ли пользователь

get isAuthenticated(): boolean {
    return this.authState !== null;
}

Проверьте, подтверждена ли электронная почта. Если вы хотите отправить электронное письмо или включить, отключить кнопку отправки электронного письма

get isEmailVerified(): boolean {
  return this.isAuthenticated ? this.authState.emailVerified : false;
}

Текущий идентификатор пользователя

get currentUserId(): string {
  return this.isAuthenticated ? this.authState.uid : null;
}

Получить данные пользователя

get userData(): any {
  if ( ! this.isAuthenticated ) {
    return [];
  }

  return [
    {
      id: this.authState.uid,
      displayName: this.authState.displayName,
      email: this.authState.email,
      phoneNumber: this.authState.phoneNumber,
      photoURL: this.authState.photoURL,
    }
  ];
}

файл компонента header.component.ts

constructor(
  private auth: AuthService
) {}

файл компонента header.component.html

<a href="#" *ngIf="auth.isAuthenticated" (click)="auth.signout($event)">Sign Out</a>
person Aamer Shahzad    schedule 02.12.2019

Я бы также добавил подписку на аутентификацию firebase в CustomersService. Тем самым мы обеспечиваем доступность текущего идентификатора пользователя.

constructor(
    private af: AngularFire,
    private router: Router) {
      this.af.auth.subscribe(auth => {
        if(auth) { 
          this.usersCustomerId = auth.uid;     
      }
  })
}

or

constructor(
    private af: AngularFire,
    private authService: AuthenticationService,
    private router: Router) {
      this.usersCustomerId = this.authService.userKey;
}
person sugarme    schedule 10.02.2017

После долгих исследований я нашел это решение, на мой взгляд, лучшее: в вашей службе аутентификации.

async getUserIDAsync() {
    const user = await this.af.authState.pipe(first()).toPromise();
    console.log(user);
    return user.uid;
  }

В вашей службе поддержки клиентов

getAllCustomers(): FirebaseListObservable<CustomerModel[]> {

    const uid = await this.authService.getUserIDAsync();
    console.log(uid);

    return this.af.database.list(this.customersRef, {
      query: {
        orderByChild: 'uid',
        equalTo: uid
      }
    });
  }

Мне гораздо проще справляться с такими ситуациями с помощью промисов, потому что это НЕ потоки, а скорее простые одноразовые операции.

person DrFred    schedule 09.06.2020

вы можете использовать метод .subscribe() для получения нужных данных, вот пример:

this.authserve.auth.subscribe(user=>{
  if(user)
    this.curruser = user.email;
})

ПС:

  1. authserve является экземпляром AngularFireAuth
  2. auth — это Observable, созданный внутри authserve
  3. curruser — это простая переменная string.
person Mohamed Hmini    schedule 29.12.2017