如何使用FirebaseUser设置自定义声明?

时间:2020-11-11 14:30:35

标签: java android firebase firebase-authentication

我正在尝试将一些键值对添加到自定义声明中,但是找不到任何函数。您如何在Android上做到这一点?

例如,我可以通过以下方式设置“显示照片”:

FirebaseUser user = ...;
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                            .setPhotoUri(Uri.parse(response.body().getPhotoURI()))
                            .build();

user.updateProfile(profileUpdates).addOnCompleteListener(task -> { ... });

2 个答案:

答案 0 :(得分:2)

客户端SDK的风险在于,恶意客户端也可以修改数据。我不确定现在可以在控制台中添加声明。那可能就是您要寻找的东西。来自Controlling Data Access Using Firebase Auth Custom Claims

将各种条件添加为自定义声明似乎是一个好主意。例如,您可能想添加家庭住址,其他照片URL或个人资料描述。但这不是自定义声明的目的。地址等数据应与身份验证无关,因此应存储在数据库中。令牌不是个人资料!

并且来自Set and validate custom user claims via the Admin SDK

自定义声明可能包含敏感数据,因此只能由Firebase Admin SDK在特权服务器环境中进行设置。

// Set admin privilege on the user corresponding to uid.
Map<String, Object> claims = new HashMap<>();
claims.put("admin", true);
FirebaseAuth.getInstance().setCustomUserClaims(uid, claims);

新的自定义声明将传播到用户的ID令牌, 下次发行新的。

并使用它:

// Verify the ID token first.
FirebaseToken decoded = FirebaseAuth.getInstance().verifyIdToken(idToken);
if (Boolean.TRUE.equals(decoded.getClaims().get("admin"))) {
  // Allow access to requested admin resource.
}

或作为客户:

// Lookup the user associated with the specified uid.
UserRecord user = FirebaseAuth.getInstance().getUser(uid);
boolean claim = Boolean.parseBoolean(user.getCustomClaims().get("admin"));

您可能需要阅读以下内容:Firebase Custom Claim Java

答案 1 :(得分:0)

无法直接在客户端应用中设置自定义声明。那将被视为安全问题。自定义声明是一种灵活的安全机制,可让您授予用户对后端资源的访问权限。如果用户可以向自己授予自定义声明,那么它们将是保护资源的无效方法。

您应该使用Firebase Admin SDK在您控制的后端上分配自定义声明,并确保仅在您允许的特定情况下为用户授予这些声明-用户不应为自己分配自定义声明。