Firebase:无法解析服务帐户:必须设置“project_id”

pzfprimi  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(187)

我尝试使用Firebase Admin SDK(java)从服务器端实现验证令牌ID,但收到错误:

无法解析服务帐户:必须设置"project_id"

我在firebase的以下路径中生成了我的凭据:
项目设置-〉服务帐户,并生成一个新的私钥,我有这个:

{
        "type": "service_account",
        "project_id": "apilogintest-9c5f5",
        "private_key_id": "<privateKeyId...>",
        "private_key": "-----BEGIN PRIVATE KEY-----\n<a really big private Key>\n-----END PRIVATE KEY-----\n",
        "client_email": "<clientEmail>",
        "client_id": "<clientId>",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://accounts.google.com/o/oauth2/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-hhay...."
}

另外,我加载JSON文件的方式与firebase网页相同:
对于maven:

使用java加载我的json文件:

FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");
    FirebaseOptions options = new FirebaseOptions.Builder()
      .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
      .setDatabaseUrl("https://apilogintest-9c5f5.firebaseio.com/")
      .build();
   FirebaseApp initializeApp = FirebaseApp.initializeApp(options);

最后一部分是当我试图验证令牌ID时:

FirebaseAuth.getInstance(initializeApp).verifyIdToken(token)
        .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
            @Override
            public void onSuccess(FirebaseToken decodedToken) {
               String uid = decodedToken.getUid();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                e.printStackTrace();

            }
        });

我想我做了同样的firebase网页提到,但我得到了上述错误
有人能帮帮我吗?
我会很感激你的帮助。

vc9ivgsu

vc9ivgsu1#

我发现了问题所在。
问题是当我试图重新验证JSON对象,在控制台打印JSON对象,我不知道为什么,但我不能执行任何处理与流(也不能使用BufferedReader)之前,设置firebase选项,我的意思是,下面的代码不运行,显示我们的错误:

    • Firebase:无法解析服务帐户:必须设置"project_id"**
try {
        String jsonData = streamToString(serviceAccount);
        JSONObject jsonObject = new JSONObject(jsonData);
        String projectId = jsonObject.getString("project_id");
        System.out.println(projectId);
    } catch (JSONException e) {
        throw new RuntimeException(e);
    }

FirebaseOptions options = new FirebaseOptions.Builder()
            .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
            .setDatabaseUrl("https://apilogintest-9c5f5.firebaseio.com").build();
    initializeApp = FirebaseApp.initializeApp(options);

但是如果我直接加载文件,如下所示,之前没有任何块代码(没有bufferedReader或jsonData = streamToString(serviceAccount);....):

FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredential(FirebaseCredentials.fromCertificate(fl))
                .setDatabaseUrl("https://apilogintest-9c5f5.firebaseio.com").build();
        initializeApp = FirebaseApp.initializeApp(options);

我不知道为什么这种行为现在起作用了。
谢谢您支持!

相关问题