1

我正在尝试使用 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 网页相同:

对于行家:

在此处输入图像描述

使用 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 网页提到的相同的操作,但我收到了上述错误

有人可以帮助我吗?

我会很感激你的帮助。

4

1 回答 1

0

我弄清楚了这个问题。

问题是当我尝试重新验证 JSON 对象,在控制台中打印 JSON 对象时,t know why but i can在设置 firebase 选项之前,我没有对 Stream 执行任何处理(也不能使用 BufferedReader),我的意思是,以下代码不会t 运行,向我们显示错误:

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);

我不知道为什么这种行为,但现在正在工作。

谢谢您的支持!

于 2017-04-03T16:08:14.400 回答