我正在用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 + nodejs在生产中的最低安全规则是什么?
发布于 2020-03-19 13:42:41
通过快速扫描您的代码,getUserById
在我看来是正确的。你采取的关键步骤:
由于令牌是使用客户端上项目的公钥签名的,只有您才能使用服务器上相同的项目凭据对其进行解码,这确保了用户不会只向您发送任何旧值。
当然,这一步取决于您实际希望在应用程序中允许的内容,但乍一看,这看起来很正常。它相当于Firestore安全规则中的检查:request.auth.uid == resource.data.uid
.
您的createUser
方法在处理ID令牌的方式上看起来非常相似。我要标记的唯一一件事是从请求体中获取fullname
,这意味着用户可以在其中传递任何他们想要的值。如果这正是您想要的,那么代码就是您想要的。但是,如果您试图获取用户的显示名称,您可能也希望从他们的ID标记中获取该名称,就像您处理UID一样。
https://stackoverflow.com/questions/60754063
复制