Firebase verifyIdToken + NodeJS Express身份验证设计

时间:2016-07-12 17:42:07

标签: swift express firebase firebase-authentication

问题: 由于立法,我 在欧盟内存储个人信息(社会安全号码)。因此,我无法将此信息存储在Firebase中,因为在使用Google的云服务时无法保证地理数据中心的位置。

我建议的解决方案: 拥有Redis密钥值存储区,其中包含可通过简单的REST API访问的敏感信息,其中使用用户ID令牌实现用户身份验证,通过HTTP标头发送。

Firebase允许通过NodeJS库中的verifyIdToken方法验证用户。这样我就可以检查用户ID是否与我的Firebase /admin端点中的任何用户ID匹配。 (或者我可以硬编码允许进入服务器的用户ID,因为没有那么多。)

因此,请求的流程如下:

  • 用户使用Firebase SDK在客户端登录。

  • 每当用户需要访问敏感信息时,它首先获取用户的ID令牌

    let currentUser = FIRAuth.auth()?.currentUser
    currentUser?.getTokenForcingRefresh(true) {idToken, error in
      if let error = error {
        return
      }
      let headers = [
         "X-FBUser-Token":idToken
      ]
      //build request here to https://myServer.com/myEndpoint
    }
    
  • 然后服务器端我们将检索请求

    app.get('/myEndpoint', function(req, res) {
      let idToken = req.get('X-FBUser-Token')
    
      verifyToken(idToken, function(isAdmin){
        if (isAdmin) {
          //Fetch the key value pair and send it back to the client here
        }
      })
    })
    
    function verifyToken(idToken, cb) {
      firebase.auth().verifyIdToken(idToken).then(function(decodedToken) {
        var uid = decodedToken.sub;
    
        firebase.database().ref('admins/' + uid).on('value', function (snap){
          cb(snap.val() !== null)
        })
      }).catch(function(error) {
        // Handle error
      });
    }
    
  • 然后客户端会收到回复并处理它。一切都通过HTTPS ofcourse完成。

注意:我知道上面的代码相当粗糙,需要一些改进,但希望你能得到这个概念

我的问题:

  • 首先,这是一种安全做事方式吗?
  • 是否有更好,更直接的方法?

0 个答案:

没有答案