Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 我可以使用Firebase IDToken安全地验证数据吗?_Reactjs_Firebase_Firebase Authentication - Fatal编程技术网

Reactjs 我可以使用Firebase IDToken安全地验证数据吗?

Reactjs 我可以使用Firebase IDToken安全地验证数据吗?,reactjs,firebase,firebase-authentication,Reactjs,Firebase,Firebase Authentication,我正在用react制作一个web应用程序。对于身份验证,我使用firebase auth,对于数据存储,我有一个带有postgresql的express后端 在从后端检索用户数据时,我正在发送当前用户的idToken(由firebase提供)。然后在我的后端,我用firebase sdk验证idToken。这足够安全吗 在未来,我将添加支付功能。验证使用firebase idToken付款的用户,然后接受付款是否足够安全 我绝对是安全方面的新手 这是我获取/更新和创建新用户的方式: con

我正在用react制作一个web应用程序。对于身份验证,我使用firebase auth,对于数据存储,我有一个带有postgresql的express后端

在从后端检索用户数据时,我正在发送当前用户的idToken(由firebase提供)。然后在我的后端,我用firebase sdk验证idToken。这足够安全吗

在未来,我将添加支付功能。验证使用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}`)
        }
      )
    })
  }

如果有安全问题,有人能解释一下吗??在生产中安全地推送webapp+NodeJ的最低安全规则是什么?

通过快速扫描代码,
getUserById
在我看来是正确的。您采取的关键步骤:

  • 您需要验证ID令牌是否有效

    由于令牌是使用客户端上项目的公钥签名的,只有您可以在服务器上使用相同的项目凭据对其进行解码,这确保了用户不能只向您发送任何旧值

  • 然后使用此ID令牌中的UID从数据库中检索该用户的数据

    这一步当然取决于您实际希望在应用程序中允许什么,但乍一看,这看起来很正常。这相当于Firestore安全规则中的检查:
    request.auth.uid==resource.data.uid

  • 您的
    createUser
    方法处理ID令牌的方式看起来非常相似。我唯一要标记的是,您从请求主体中获取
    fullname
    ,这意味着用户可以在其中传递他们想要的任何值。如果这正是您想要的,那么代码将执行您想要的操作。但是如果您试图获取用户的显示名,您可能也希望从他们的ID令牌中获取,就像您对UID所做的那样