Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

04D

17H

33M

04S

7

Cómo usar variables de entorno en el proyecto Platzi Conf Merch (localmente y en producción)

En este proyecto existen dos credenciales que debemos darles mucha importancia: el CLIENT_ID para conectarnos a la API de PayPal y el API_KEY de la API de Google. Estas dos credenciales no debemos quemarlas en nuestro código y deben ser tratadas como variables de entorno.

¿Pero cómo hacemos eso?

Debemos hacer algunas adiciones a nuestro proyecto porque necesitamos que estas variables queden disponibles en desarrollo y en producción.
También trate a la URL de la API de Strapi como variable de entorno.

Para desarrollo:

  • Instalamos una dependencia que posiblemente ya conozcas para usar variables de entorno: dotenv
npm i dotenv -D
  • dotenv nos permite importar variables de entorno desde un archivo .env. Esta librería se usa en el curso de Backend con Nodejs por que en Backend se usan mucho las variables de entorno.
  • Ahora creamos el archivo .env en la raíz del proyecto donde escribimos las variables de entorno:
# .env# PAYPAL
PAYPAL_CLIENT_ID=...

# GOOGLE_MAPS
GOOGLE_MAPS_API_KEY=...

# STRAPI
API_URL=...
  • Ahora en el archivo webpack.config.js añadimos esta configuración:
// webpack.config.js// Importamos EnvorinmentPlugin de webpackconst { EnvironmentPlugin } = require('webpack');

// Importamos y usamos dotenvrequire('dotenv').config();

module.exports = {
  ...,
  plugins: [
    ...
		// Nuevo Pluginnew EnvironmentPlugin([
      'PAYPAL_CLIENT_ID',
      'GOOGLE_MAPS_API_KEY',
      'API_URL',
    ]),
		...
  ],
  ...
};
  • webpack tiene un plugin nativo llamado EnvironmentPlugin que se encarga de tomar las variables de entorno del proceso de Node por el que corre webpack y guardarlas en variables process.env.<nombre-variable> que podemos usar en nuestra aplicación.
  • Ahora podemos usar estas variables en nuestros componentes, de esta forma:
// src/containers/Payment.jsxconst Payment = () => {
  ...

  const paypalOptions = {
    clientId: process.env.PAYPAL_CLIENT_ID, // 0.0
    intent: 'capture',
    currency: 'USD',
  };

  ...

  return ( ... );
};

Pero esto solo funciona en desarrollo, en tu entorno local.

Para producción:

  • Nuestro proyecto es desplegado con GitHub Actions. Por lo que las variables de entorno las agregamos en los SECRETS de nuestro repo:
screenshot.png
  • En el archivo para hacer deploy, en build el comando es el siguiente:
# .github/workflows/deploy-to-firebase.ymlname: Build and Deploy
on: [push]
jobs:build:name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/[email protected]
      - name: Install Dependencies
        run: npm install
      - name: Build # Esto cambiarun: PAYPAL_CLIENT_ID=$PAYPAL_CLIENT_ID GOOGLE_MAPS_API_KEY=$GOOGLE_MAPS_API_KEY API_URL=$API_URL npm run build
        env:GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }}PAYPAL_CLIENT_ID: ${{ secrets.PAYPAL_CLIENT_ID }}API_URL: ${{ secrets.API_URL }}
      - name: Archive Production Artifact
        uses: actions/[email protected]
        with:name: dist
          path: dist
  deploy:name: Deploy
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/[email protected]
      - name: Download Artifact
        uses: actions/[email protected]
        with:name: dist
          path: dist
      - name: Deploy to Firebase
        uses: w9jds/[email protected]
        with:args: deploy --only hosting
        env:FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
  • Una vez hagas push a tu repo, este action correrá con las variables de entorno que guardaste en tus SECRETS, y tu proyecto funcionará.

Cabe resaltar que esto no hará que nuestras credenciales permanezcan secretas, ya que todo el código en el Frontend es visible y abierto, pero esto ayuda a que nosotros podamos cambiar estas variables sin tener que hacer un commit ya que no forman parte del repositorio.

Escribe tu comentario
+ 2
Ordenar por:
2

Muy bueno capo!!

A mí me pareció raro que un maestro como Oscar quemara las keys en el codigo, asique investigué y comenté un pequeño tutorial, pero ni cerca de estar tan bueno como el tuyo.
.
De hecho voy a implementarlo como lo hiciste vos.
.
La unica duda que tengo, cuando decís que las credenciales no permanecen secretas en el frontend, te referís a que se ven usando las developer tools? y cómo se podría evitar eso?

1
8 meses

Sí, se refiere exactamente a eso, con las dev tools puedes verlo. Simplemente abres las herramientas del desarrollador y vas a Source.

Aquí se verá el empaquetado que genera Webpack. Ve al archivo de Javascript para que se abra el código. Si seguiste el curso, debería llamarse "bundle.js.

Una vez que se abra el código, presiona ctrl+F para búsqueda y busca por el ID o el API Key que hayas utilizado y verás que te aparece.

En mi caso, para Paypal utilice “sb” (sandbox) en lugar de mi ID directamente. Lo busqué y sí apareció. (ver imagen que pongo abajo)

En el caso de Google Maps, busqué por mi API_Key y también apareció expuesta.

Respecto a cómo solucionarlo, busqué y parece ser que requieres un poco de conocimiento de Backend.

En esencia, haces la solicitud al backend y el backend es el que se encarga de hacer la petición a las API’s. Una vez que tiene la respuesta, la envía al frontend.

Hay gente que te ayuda a eso, por ejemplo este artículo.

Aunque yo, por el momento, prefiero restringir directamente la API de Google en la consola de google (restricción por url de acceso) y en la de paypal me quedo con “sb”.

Dado que también estudiaré backend, pronto estaré en la capacidad de hacer todo esto.

env_exposed.png
2
36308Puntos

Excelente, se nota que eres el maestro de los cuatro elementos.

1
18717Puntos

Tengo problemas para ejecutar npm i dotenv -D

Me aparece el siguiente error, me podrían ayudar

npm ERR! code EACCES
npm ERR! syscall rename
npm ERR! path /home/mgc22/store-online/node_modules/dotenv
npm ERR! dest /home/mgc22/store-online/node_modules/.dotenv-6e7i0c3z
npm ERR! errno -13npm ERR! Error: EACCES: permission denied, rename '/home/mgc22/store-online/node_modules/dotenv' ->'/home/mgc22/store-online/node_modules/.dotenv-6e7i0c3z'npm ERR!  [Error: EACCES: permission denied, rename '/home/mgc22/store-online/node_modules/dotenv' ->'/home/mgc22/store-online/node_modules/.dotenv-6e7i0c3z'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'rename',
npm ERR!   path: '/home/mgc22/store-online/node_modules/dotenv',
npm ERR!   dest: '/home/mgc22/store-online/node_modules/.dotenv-6e7i0c3z'npm ERR! }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you donot have the permissions to access this file as the current user
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, ortry running
npm ERR! the command again as root/Administrator.

npm ERR! A complete log ofthis run can be found in:
npm ERR!     /home/mgc22/.npm/_logs/2022-08-02T22_36_27_764Z-debug-0.log```
1
18717Puntos
7 meses

Ya lo resolví, no se si fue la documentación que leí o solo era cerrar la terminal, apagar la computadora, descansar y volver a intentarlo a otro día. No sé que fue primero si el huevo o la gallina pero funcionó!!!