java - 在 Java 中解码 Firebase token

标签 java firebase firebase-authentication firebase-admin

我正在尝试在后端验证/解码 token ,然后从解码的 token 中检索用户 UID。 token 由客户端作为字符串生成。后端成功检索/设置 Firebase 数据,这让我相信 Firebase 正在正确初始化,因此这不会成为问题。但是运行时,似乎出现错误导致崩溃。

代码:

public static void main(String[] args) throws IOException, ExecutionException, InterruptedException, FirebaseAuthException {
        File credentialsFile = getFile();

        FileInputStream serviceAccount = new FileInputStream(credentialsFile);

        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("***")
                .build();

        FirebaseApp.initializeApp(options);

        String idToken = "***";

        //LINE 43 IS BELOW
        FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
        String uid = decodedToken.getUid();

        System.out.println("UID: " + uid);
    }

错误:

Exception in thread "main" java.lang.IllegalArgumentException
    at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:108)
    at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37)
    at com.google.api.client.json.webtoken.JsonWebSignature$Parser.parse(JsonWebSignature.java:599)
    at com.google.firebase.auth.FirebaseToken.parse(FirebaseToken.java:44)
    at com.google.firebase.auth.FirebaseAuth$4.execute(FirebaseAuth.java:484)
    at com.google.firebase.auth.FirebaseAuth$4.execute(FirebaseAuth.java:477)
    at com.google.firebase.internal.CallableOperation.call(CallableOperation.java:36)
    at com.google.firebase.auth.FirebaseAuth.verifyIdToken(FirebaseAuth.java:441)
    at com.google.firebase.auth.FirebaseAuth.verifyIdToken(FirebaseAuth.java:415)
    at App.main(App.java:43)

FAILURE: Build failed with an exception.

最佳答案

解决方案:

问题出在客户端生成 token 的方式,如 hiranya-jayathilaka 所指出的。 。这就是我生成 token 的方式:

String idToken = FirebaseInstanceId.getInstance().getToken();

这就是根据 docs 生成的方式:

FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
            mUser.getIdToken(true)
                    .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
                        public void onComplete(@NonNull Task<GetTokenResult> task) {
                            if (task.isSuccessful()) {
                                String idToken = task.getResult().getToken();
                                // Send token to your backend via HTTPS
                                // ...
                            } else {
                                // Handle error -> task.getException();
                            }
                        }
                    });

关于java - 在 Java 中解码 Firebase token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54506063/

相关文章:

java - 将 websocket 入站 channel 适配器连接到网关的回复 channel

node.js - 使用node.js firebase.storage is not a function错误

Android Studio : App crashes after adding Firebase

firebase - Cloud Firestore 查询以获取文档 ID,Flutter

android - Task.isSuccessful() 为 false,无法添加任何用户

java - 当应用程序关闭时,我可以不断地从服务类中收听数据变化吗?

java - 如何清除 SpringSource Tool Suite 缓存?

java - 将 Python 生成的哈希值与 Java 中的原始密码进行比较时,盐修订版无效

liquibase 中的 Java 代码变更集

iOS - Firebase - 如何使用 facebook 登录已通过电子邮件注册注册