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:
dotenv
npm i dotenv -D
# .env# PAYPAL
PAYPAL_CLIENT_ID=...
# GOOGLE_MAPS
GOOGLE_MAPS_API_KEY=...
# STRAPI
API_URL=...
// 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.// 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:
# .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 }}
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.
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?
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.
Excelente, se nota que eres el maestro de los cuatro elementos.
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```
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ó!!!