Безопасно ли проверять данные с помощью Firebase IDToken? - PullRequest
0 голосов
/ 19 марта 2020

Я делаю веб-приложение с реагировать. Для аутентификации я использую firebase auth, а для хранения данных у меня есть express backend с postgresql.

В данный момент для получения пользовательских данных из моего бэкэнда я отправляю idToken текущего пользователя (предоставлен из firebase). Затем в своем бэкэнде я проверяю idToken с помощью firebase sdk. Это достаточно безопасно?

В будущем я собираюсь добавить функции платежей. Достаточно ли безопасно проверить пользователя, который платит с помощью firebase idToken, а затем принять платеж?

Я абсолютно новичок в безопасности!

Вот так я получаю / обновляю и создаю новый пользователь:

   const getUserById = (request, response) => { //Dammi l'utente con il tokenID passato
    const idToken = request.params.idToken
    utils.firebase.auth().verifyIdToken(idToken)
      .then(function(decodedToken){
        let uid = decodedToken.uid

        utils.pool.query('SELECT * FROM users WHERE uid = $1', [uid], (error, results) => {
          if (error) {
            throw error
          }
          response.status(200).json(results.rows)
        })
      }).catch(function(error) {
        // Handle error
      });
  }



const createUser = (request, response) => { //Crea nuovo user
    const { idToken, fullname} = request.body

      utils.firebase.auth().verifyIdToken(idToken) //Verifico il token utente in ingresso
        .then(function(decodedToken) { //se è verificato allora estraggo l'uid
          let uid = decodedToken.uid;
          console.log("Registered new User, UID: " + uid)
          console.log("name: " + fullname)
          utils.pool.query('INSERT INTO users (uid,fullname) VALUES ($1, $2)', [uid, fullname], (error, results) => {
            if (error) {
              throw error
            }
            response.status(201).send(`User added with ID: ${results}`)
          })
        }).catch(function(error) {
          // Handle error
        });
  }


  const updateUser = (request, response) => { //Aggiorna le info dell'utente, nome e biografia, l'email verrà gestita da firebase
    const idToken = request.params.idToken
    const { fullname, bio } = request.body

    utils.firebase.auth().verifyIdToken(idToken) //verifico che il token sia vero
    .then(function(decodedToken){
      let uid = decodedToken.uid //estrapolo lo uid dell'utente
      console.log("Edited the user: " + uid)
      console.log("Name: " + fullname)


      utils.pool.query(
        'UPDATE users SET fullname = $1, bio = $2 WHERE uid = $3', [fullname, bio, uid], (error, results) => {
          if (error) {
            throw error
          }
          response.status(200).send(`User modified with ID: ${results}`)
        }
      )
    })
  }

Может кто-нибудь объяснить мне, если есть проблемы с безопасностью ?? А минимальные правила безопасности для пу sh веб-приложения + nodejs на производстве безопасно?

1 Ответ

0 голосов
/ 19 марта 2020

После быстрого сканирования вашего кода, getUserById выглядит мне правильно. Важные шаги, которые вы предпринимаете:

  1. Вы подтверждаете, что токен ID действителен.

    Поскольку токен подписан с помощью ключа publi c вашего проекта на клиенте, который только вы можете декодировать с теми же учетными данными проекта на сервере, это гарантирует, что пользователи не смогут отправлять вам только старые значение.

  2. Затем вы используете UID из этого токена ID, чтобы получить данные для этого пользователя из базы данных.

    Этот шаг, конечно, зависит от того, что вы на самом деле хотите Позвольте в вашем приложении, но на первый взгляд это выглядит нормально. Это аналог проверки в правилах безопасности Firestore: request.auth.uid == resource.data.uid.

Ваш createUser метод выглядит достаточно похожим в том, как он обрабатывает ID-токен. Единственное, что я отмечу здесь, это то, что вы берете fullname из тела запроса, что означает, что пользователь может передать туда любое значение, которое он хочет. Если это именно то, что вы хотите, то код делает то, что вы хотите. Но если вы пытаетесь получить отображаемое имя пользователя, возможно, вы захотите получить его и из его идентификатора, точно так же, как вы делаете это с UID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...