Kus*_*han 5 android firebase firebase-authentication
我有一个 UID 1 的用户,其中自定义声明设置为,
frompos=true
Run Code Online (Sandbox Code Playgroud)
我通过以下方式从 ADMIN SDK for java 向该用户设置新的自定义声明:
Map<String,Object> claims = new HashMap<>();
claims.put("frompos",false);
FirebaseAuth.getInstance().setCustomUserClaimsAsync("1", claims).get(10000,
TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)
我在服务器端打印声明以检查声明是否已设置:
UserRecord user = FirebaseAuth.getInstance().getUserAsync("1").get(10000,
TimeUnit.MILLISECONDS);
LOG.debug("user new claims " + user.getCustomClaims());
Run Code Online (Sandbox Code Playgroud)
正如预期的结果是索赔得到确定:
user new claims {frompos=false}
Run Code Online (Sandbox Code Playgroud)
现在在 android sdk 端,我已经让用户登录,因此我手动刷新 ID 令牌以按照文档所述传播声明(https://firebase.google.com/docs/auth/admin/custom-claims)
FirebaseAuth.getInstance().getCurrentUser().getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
@Override
public void onComplete(@NonNull Task<GetTokenResult> task) {
if(task.isSuccessful()){
Log.d("FragmentCreate","Success refreshing token "+(FirebaseAuth.getInstance().getCurrentUser()==null));
Log.d("FragmentCreate","New token "+task.getResult().getToken());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("FragmentCreate","Failure refreshing token "+(FirebaseAuth.getInstance().getCurrentUser()==null)+" "+e.toString());
}
});
Run Code Online (Sandbox Code Playgroud)
现在,我使用此处打印的打印 ID 令牌并在服务器端验证它并从中打印声明
FirebaseToken tokenTest = FirebaseAuth.getInstance(ahmedabadRepoApp).verifyIdTokenAsync(token).get(10000,TimeUnit.MILLISECONDS);
LOG.debug("Token claims are "+tokenTest.getClaims());
Run Code Online (Sandbox Code Playgroud)
但这里打印的声明是:
{"aud":"ahmedabadrepo","auth_time":1514724115,"email_verified":false,"exp":1514730425,"iat":1514726825,"iss":"https://securetoken.google.com/ahmedabadrepo","sub":"1","frompos":true,"user_id":"1","firebase":{"identities":{},"sign_in_provider":"custom"}}
Run Code Online (Sandbox Code Playgroud)
因此,即使我手动刷新了 Id 令牌,frompos 值也不会传播到客户端 sdk。
我在 Angular 中遇到了同样的问题 - 我使用服务器上的 Admin SDK 设置了声明,但随后它们就不会出现在客户端的用户中。
\n\n使用以下内容我可以看到有效负载中的声明:
\n\n this.firebaseAuth.auth.currentUser.getIdToken().then(idToken => {\n\n const payload = JSON.parse(this.b64DecodeUnicode(idToken.split(\'.\')[1]))\n\n console.log(payload);\n }\n\n )\n\nb64DecodeUnicode(str) {\n return decodeURIComponent(atob(str).replace(/(.)/g, function (m, p) {\n var code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \'0\' + code;\n }\n return \'%\' + code;\n }));\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n这是我复制上面内容的一个很好的写法:
\n\n\n\n\n目前,客户端代码必须解析和解码用户\xe2\x80\x99s ID\n 令牌,以提取其中嵌入的声明。将来,\n Firebase 客户端 SDK 可能会为此用例提供\n 更简单的 API。
\n
Firebase文档中的相关信息:
\n\n\n\n\n自定义声明只能通过用户的 ID 令牌检索。\n 可能需要访问这些声明才能根据用户的角色或访问级别修改客户端 UI。但是,在验证 ID 令牌并解析其声明后,后端访问应始终通过 ID 令牌强制执行。自定义声明不应直接发送到后端,因为在令牌之外无法信任它们。
\n\n一旦最新的声明传播到用户的 ID 令牌,您就可以通过首先检索 ID 令牌然后解析其有效负载(base64 解码)来获取这些声明:
\n
// https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding\nfirebase.auth().currentUser.getIdToken()\n .then((idToken) => {\n // Parse the ID token.\n const payload = JSON.parse(b64DecodeUnicode(idToken.split(\'.\')[1]));\n // Confirm the user is an Admin.\n if (!!payload[\'admin\']) {\n showAdminUI();\n }\n })\n .catch((error) => {\n console.log(error);\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
4286 次 |
最近记录: |