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!).

Latest comments (2)

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