有没有办法确定Firebase用户的UID是否有效?



我正在构建一个我希望仅由身份验证的用户使用的服务器路由。我计划将带有帖子的用户发送到此路线,我想验证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:

  1. 如果使用显式ProjectID应用选项初始化了SDK,则SDK使用该选项的值。

  2. 如果SDK使用服务帐户凭据初始化,则SDK使用服务帐户的Project_ID字段JSON对象。

  3. 如果设置了Google_cloud_project环境变量,则SDK使用其值作为项目ID。此环境变量可用于在Google基础架构(例如App Engine和Compute Engine)上运行的代码。

检查文档

最新更新