DEV Community

jacksonPrimo
jacksonPrimo

Posted on • Updated on

Configurando Nestjs com Firebase Admin

NestJs

Nestjs é um framework voltado para construção de aplicações nodejs de forma performática e escalável. Possui suporte a diferentes paradígmas de programação tais como programação orientada a objetos e funcional dando um toque de flexibilidade na hora de codar.

Firebase

O firebase é um Backend as a Service(BaaS), uma série de serviços em nuvem que abstraem taréfas repetitivas e pesadas para desenvolvedores tais como autenticação de usuário, armazenamento de dados dentre outros.

Lets Bora

Para iniciarmos um projeto nest usamos os seguintes comandos:

npm i -g @nestjs/cli //para instalar o nest cli de forma global
nest new project-name //para criar um projeto

Enter fullscreen mode Exit fullscreen mode

Ele vai pergutar qual gerenciador de pacotes deseja usar, no meu caso vou usar o yarn:

 Which package manager would you ❤️  to use?
  npm
> yarn
  pnpm
Enter fullscreen mode Exit fullscreen mode

Instale o firebase-admin:

yarn add firebase-admin
//ou
npm i firebase-admin
Enter fullscreen mode Exit fullscreen mode

Instale o dotenv para que os dados sensiveis do firebase sejam gravados em variáveis de ambiente e assim tornar mais segura estas informações:

yarn add dotenv
//ou
npm i dotenv
Enter fullscreen mode Exit fullscreen mode

No arquivo main.ts na pasta src inicialize o dotenv:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as dotenv from 'dotenv';

dotenv.config();

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

Enter fullscreen mode Exit fullscreen mode

Dentro da pasta src crie um arquivo chamado firebase.config.ts, com as seguintes informações:

import * as firebase from 'firebase-admin';

export function initializeFirebase() {
    var serviceAccount = JSON.parse(process.env.FIREBASE);
    firebase.initializeApp({
        credential: firebase.credential.cert(serviceAccount),
        databaseURL: "https://exemplo-app.firebaseio.com"
    });
}

Enter fullscreen mode Exit fullscreen mode
  1. Importamos todo conteúdo de firebase-admin e nomeamos como firebase
  2. exportamos a função que irá inicializar a conexão
  3. pegamos as credênciais de uma variável de ambiente, que está em formato json e transformamos em um objeto com JSON.parse()
  4. chamamos as função firebase.initializeApp() passando as credenciais

Para obtermos as credenciais temos que ir no nosso projeto do firebase e em:

configuração do projeto

contas de serviço

gerar nova chave privada


Será iniciado o download de um arquivo JSON que conterá informações confidenciais do projeto usadas para fazer a integração, portanto tome cuidado onde deixa este arquivo e se possível o exclua após pegar suas informações. Ele terá as seguintes informações:

{
 "type": "service_account", 
 "project_id": "exemplo-app", 
 "private_key_id": "000000000000000000000000000000000000", 
 "private_key": "-----BEGIN PRIVATE KEY-----varias letras aleatórias-----END PRIVATE KEY-----\n", 
 "client_email": "firebase-adminsdk-xxx@exemplo-app.iam.gserviceaccount.com", 
 "client_id": "000000000000000", 
 "auth_uri": "https://accounts.google.comxxxxxx", 
 "token_uri": "https://xxxx.googleapis.com/token", 
 "auth_provider_x509_cert_url":"https://www.googleapis.com/xxx", 
 "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/xxxxgserviceaccount.com"
}

Enter fullscreen mode Exit fullscreen mode

Crie um arquivo .env na raiz de seu projeto e dentro dele crie uma variável de ambiente chamada FIREBASE, você deve setar seu valor colocando todas as credenciais do arquivo json em apenas uma linha:

//.env
FIREBASE={"type": "service_account", "project_id": "exemplo-app", "private_key_id": "000000000000000000000000000000000000", "private_key": "-----BEGIN PRIVATE KEY-----varias letras aleatórias-----END PRIVATE KEY-----\n", "client_email": "firebase-adminsdk-xxx@exemplo-app.iam.gserviceaccount.com", "client_id": "000000000000000", "auth_uri": "https://accounts.google.comxxxxxx", "token_uri": "https://xxxx.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/xxx", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/xxxxgserviceaccount.com"}
Enter fullscreen mode Exit fullscreen mode

Novamente no arquivo main.ts na pasta src, inicialize o firebaseConfig:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as dotenv from 'dotenv';
import { initializeFirebase } from './firebase.config';

dotenv.config();
initializeFirebase();

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

Enter fullscreen mode Exit fullscreen mode

Podemos testar nossa integração criando um arquivo user.repository.ts dentro da pasta "src/repositorys":

import { Injectable } from "@nestjs/common";
import * as firebase from 'firebase-admin';
@Injectable()
export class UserRepository {
    private _collectionRef: FirebaseFirestore.CollectionReference = firebase.firestore().collection('user');
    public async getUser(UserId: string): Promise<any> {
         return this._collectionRef.doc(UserId).get();
    }
}
Enter fullscreen mode Exit fullscreen mode

finalizando

Bom com esta configuração você poderá gravar dados no banco do firebase, atualizar ou apagar dados de autenticação de usuário tais como senhas e emails etc. É isso, obrigado por lerem este artigo e espero que ele tenha os ajudado! :)
(caso não: coloque mais café na chicara e não desanime!).

Top comments (3)

Collapse
 
fergolive profile image
Fernando Garcia

Consegui!! obrigado, ja listei uma colecao de firestore, ok

Collapse
 
brenoo2018 profile image
Taynan Breno

Como seria feito essa referência firebase ao invés do firestore ser com o realtime database ?
nessa parte do código
import { Injectable } from "@nestjs/common";
import * as firebase from 'firebase-admin';
@Injectable()
export class UserRepository {
private _collectionRef: FirebaseFirestore.CollectionReference = firebase.firestore().collection('user');
public async getUser(UserId: string): Promise {
return this._collectionRef.doc(UserId).get();
}
}

Collapse
 
jackson_primo profile image
jacksonPrimo

firebase.google.com/docs/database/...
firebase.google.com/docs/firestore...

Bem provável que getDatabase ou getFirestore ofereçam essa forma de trabalhar com o banco sem uso de real time