@Bulgar

Как скрыть Api ключи в react?

Добрый день. Сделал сайт все работает Но стоит мне скрыть Api ключи при помощи .env в разделе обратной связи после нажатия кнопки отправить сообщение перестает отправляться.

import React, { useState } from "react";
import axios from "axios";
import styles from "./Modpr.module.css";


  
const Mod = ({ closeModal }) => {
   
    const [name, setName] = useState('');
    const [email, setEmail] = useState('');
    const [message, setMessage] = useState('');


    const [isLoading, setIsLoading] = useState(false);
    const [showThankYou, setShowThankYou] = useState(false);


   
   const handleSubmit = async (e) => {
        
      

        e.preventDefault();

        

        setIsLoading(true);    

      

       const serviceId = process.env.REACT_APP_SERVICE_ID;
        const templateId = process.env.REACT_APP_TEMPLATE_ID;
        const publicKey = process.env.REACT_APP_PUBLIC_KEY;

  const data = {
     
            service_id: serviceId,
            template_id: templateId,
            user_id: publicKey,
            template_params: {
                from_name: name,
                from_email: email,
                to_name: 'Web Wizard',
                message: message,
            }
        };

        try {
            const res = await axios.post("https://api.emailjs.com/api/v1.0/email/send", data);
            console.log(res.data);
            
            
            setShowThankYou(true);
            
            
            
            
            setName('');
            setEmail('');
            setMessage('');
        } catch (error) {
            console.error(error);
        }
     }



return (
    <div className="modal">
        <div className="modalContent">
            {showThankYou ? (
                <>
                    <p>Спасибо за обращение!</p>
                    <button onClick={closeModal}>Вернуться на главную</button>
                </>
            ) : (
                <form onSubmit={handleSubmit} className='emailForm'>
                    <div className={styles.formGroup}>
                        <input
                            type="text"
                            placeholder="Введите свое имя"
                            value={name}
                            onChange={(e) => setName(e.target.value)}
                        />
                    </div>

                    <div className={styles.formGroup}>
                        <input
                            type="email"
                            placeholder="Ваш Email"
                            value={email}
                            onChange={(e) => setEmail(e.target.value)}
                        />

                    </div>
                    <div className={styles.formGroup}>
                        <textarea
                            cols="30"
                            rows="10"
                            placeholder="(необязательно)"
                            value={message}
                            onChange={(e) => setMessage(e.target.value)}
                        >
                        </textarea>
                    </div>
                    <button type="submit">{isLoading ? "Идет отправка..." : "Отправить"}</button>
                </form>
            )}

            {/* <button onClick={closeModal}>Закрыть</button> */}
        </div>
    </div>
);

}

export default Mod;
  • Вопрос задан
  • 3655 просмотров
Пригласить эксперта
Ответы на вопрос 3
@ymaril
Все что доступно фронтенду - доступно и злоумышленнику. То есть, любой пользователь вашего приложения может ваш ключ от мейлера украсть.
Решить это можно только своим бекендом. Который будет знать ключ, но не будет его показывать фронтенду. А так же сам будет ходить с этим ключом в апи мейлера. А фронтенд будет просто просить бекенд отправить письмо.

В таком варианте злоумышленник уже не сможет получить доступ к апи ключу, но сможет намеренно спамить ваш бекенд чтобы он отправлял письма. На уровне бекенд можно вставить ещё заборы: например, не давать отправлять больше одного письма на один адрес.

Так же, по опыту, process.env в фронтовых приложениях не самая очевидная штука. Лучше избегать его использования. Это объект с переменными процесса. Но если приложение работает в браузере, то там нет окружения и процесса и этих переменных.
Такой подход оправдан в бекенде, где ты сам контролируешь где и в каких условиях приложение будет работать.
Конфиги клиентского приложения лучше получать с бекенда. А там их уже можно и в .env хранить
Ответ написан
Комментировать
402d
@402d
начинал с бейсика на УКНЦ в 1988
Извините, но ваша ситуация выглядит странно.
Во первых, Вы взяли апи для отправки сообщений, которое позиционируется как не требующее серверной части :
"Послать письмо из явоскрипта".
Во вторых публичный ключ, который вы хотите скрыть - это аналог подменного номера телефона на досках объявлений. Типа написать письмо можно и ваш реальный емайл не светиться.

В вашем случае "ключи доступа к сторонним сервисам никогда не передаются на сторону клиента" не принимимо.
Это получается "масло масленное" .
Ответ написан
@HzzH
Bulgar Привет. Недавно имел дело с этим сервисом. Что в итоге точно могу сказать, это то что ключ никак не спрятаешь, потому что он указывается явно в инициализации класса и .env здесь не поможет, так как переменные окружения при билде попадают в .bundle.js (или какой там настроен), который и запускается на фронте. А если просто хотите использовать env-переменные в React, попробуйте установить dotenv (npm i dotenv) и импортировать его в корневой файл (index.js или какой у вас) import 'dotenv'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час