我正在构建一个我希望仅由身份验证的用户使用的服务器路由。我计划将带有帖子的用户发送到此路线,我想验证UID是Firebase中存在的UID。我知道我可以在firebase中手动添加UID并根据此数据进行检查,但是是否可以看到UID Firebase身份验证正在跟踪什么?我认为这种方法会更好,然后检查我自己的列表。
目的是确保没有假uid访问这些路线(例如,出于恶意目的)。
验证UID不足以阻止恶意用户:1)攻击者可以通过发送其他用户的UID来假装是其他用户,而2)UID永远不会更改或过期,这意味着那里意味着那里无法执行用户(或攻击者)重新认证。
您需要的是将firebase令牌从客户端应用程序传递到服务器,并在接受它之前验证令牌。
-
令牌由Firebase私钥牢固地签名。没有其他一方可以发出有效的火箱代币。
-
令牌只有一个小时。firebase服务器将在发出新令牌之前检查帐户状态(例如密码更改事件)。
-
令牌有效载荷包含UID和受众。您应该验证受众是您自己的应用程序。
您可以使用Firebase Admin SDK或第三方库来验证Firebase令牌。有关详细信息,请参见Firebase Doc。
您可以通过使用服务器上的Firebase Admin SDK检查特定的UID是否对应于项目中的Firebase身份验证用户。从有关检索用户数据的Firebase文档中:
admin.auth().getUser(uid)
.then(function(userRecord) {
// See the UserRecord reference doc for the contents of userRecord.
console.log("Successfully fetched user data:", userRecord.toJSON());
})
.catch(function(error) {
console.log("Error fetching user data:", error);
});
当将firebase用户身份验证到firebase时,uid是有效载荷的一部分,并且当未对用户进行身份验证时为null。您可以在用户身份验证时获得UID。语法是不同的,具体取决于您正在工作的框架。
查看firebase API参考以获取特定语法和示例:https://firebase.google.com/docs/reference/
在客户端应用中创建一个令牌
private String getAuthTokenAndPost(){
mAuth.getCurrentUser().getIdToken(false).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
@Override
public void onComplete(@NonNull Task<GetTokenResult> task) {
if(task.isSuccessful()){
String idToken = task.getResult().getToken();
sendReqToServer(idToken);
}else{
Toast.makeText(CartActivity.this, "couldn't generate Token", Toast.LENGTH_SHORT).show();
}
}
});
return "";
}
然后在服务器端使用Firebase Admin SDK,这是节点服务器的示例
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((error) => {
// Handle error
});
ID令牌验证需要项目ID。Firebase Admin SDK尝试通过以下方法之一获得项目ID:
如果使用显式ProjectID应用选项初始化了SDK,则SDK使用该选项的值。
如果SDK使用服务帐户凭据初始化,则SDK使用服务帐户的Project_ID字段JSON对象。
如果设置了Google_cloud_project环境变量,则SDK使用其值作为项目ID。此环境变量可用于在Google基础架构(例如App Engine和Compute Engine)上运行的代码。
检查文档