【问题标题】:I secure to validate data using Firebase IDToken?我可以安全地使用 Firebase IDToken 验证数据吗?
【发布时间】:2020-06-30 09:42:09
【问题描述】:

我正在制作一个带有反应的网络应用程序。对于身份验证,我使用的是 firebase auth,对于数据存储,我有一个带有 postgresql 的快速后端。

目前,为了从后端检索用户数据,我正在发送当前用户的 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 + nodejs 的最低安全规则?

【问题讨论】:

    标签: reactjs firebase firebase-authentication


    【解决方案1】:

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

    1. 您验证 ID 令牌是否有效。

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

    2. 然后您使用此 ID 令牌中的 UID 从数据库中检索该用户的数据。

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

    您的 createUser 方法在处理 ID 令牌的方式上看起来非常相似。我唯一要标记的是您从请求正文中获取fullname,这意味着用户可以在那里传递他们想要的任何值。如果这正是你想要的,那么代码就会做你想要的。但是,如果您尝试获取用户的显示名称,您可能也希望从他们的 ID 令牌中获取该名称,就像使用 UID 一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2017-04-09
      • 1970-01-01
      相关资源
      最近更新 更多