【问题标题】:Getting Custom tokens from Android App in Firebase Auth在 Firebase Auth 中从 Android 应用获取自定义令牌
【发布时间】:2020-10-08 19:53:04
【问题描述】:
我正在开发一个需要 firebase 自定义令牌的应用程序。
我可以通过 node.js 服务器中的可调用云函数分配自定义声明。现在我需要在我的应用程序中使用它们来控制访问。我怎样才能实现它?
FirebaseAuth.getInstance().getCurrentUser().getTokens()
这样
我尝试从 firestore 获取令牌,但它需要读取操作。
【问题讨论】:
标签:
java
android
firebase
firebase-authentication
【解决方案1】:
在 Auth 用户上使用 getIdToken() 以获取声明。
看看下面的例子:
user.getIdToken(false).addOnSuccessListener(new OnSuccessListener<GetTokenResult>() {
@Override
public void onSuccess(GetTokenResult result) {
boolean isAdmin = result.getClaims().get("admin");
if (isAdmin) {
// Show admin UI.
showAdminUI();
} else {
// Show regular user UI.
showRegularUI();
}
}
});
另外请记住,在更新之前需要刷新 ID 令牌,您可以按照以下方式进行操作,
currentUser.getIdToken(true)
自定义声明仅用于验证角色和存储非常小的数据。它不应该用来保存用户的信息。
来源和进一步阅读:https://firebase.google.com/docs/auth/admin/custom-claims#propagate_custom_claims_to_the_client
【解决方案2】:
currentUser 具有带有回调参数 addOnSuccessListener 的 getIdToken 方法。 addOnSuccessListener 提供对 GetTokenResult(map) 的访问权限,使用它来检查您的声明。
private fun login() {
val user = FirebaseAuth.getInstance().currentUser
if (user == null) showAuthActivity()
user?.getIdToken(true) // forceRefresh: boolean Force refresh regardless of token expiration.
?.addOnSuccessListener {it: GetTokenResult ->
val role = (it.claims["admin"] as? Boolean)
?: (it.claims["clientUser"] as? Boolean) ?: false
if (role) {
startActivity(Intent(this, MainActivity::class.java))
finish()
} else {
showAuthActivity()
showToast("You don't have permissions to use this app")
}
}
?.addOnFailureListener {
showAuthActivity()
showToast("Something went wrong e = ${it.message}")
}?.addOnCanceledListener {
showAuthActivity()
}
}