Java Firebase:无法分析服务帐户:';项目id';必须设置

Java Firebase:无法分析服务帐户:';项目id';必须设置,java,firebase,firebase-authentication,firebase-admin,Java,Firebase,Firebase Authentication,Firebase Admin,我试图使用Firebase Admin SDK(java)从服务器端实现验证令牌id,但我得到了错误: 无法分析服务帐户:必须设置“项目id” try { String jsonData = streamToString(serviceAccount); JSONObject jsonObject = new JSONObject(jsonData); String projectId = jsonObject.getString("project

我试图使用Firebase Admin SDK(java)从服务器端实现验证令牌id,但我得到了错误:

无法分析服务帐户:必须设置“项目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);
我从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...."
}
最后一部分,当我尝试验证令牌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();

            }
        });
FirebaseAuth.getInstance(初始化EAPP).verifyIdToken(令牌)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(FirebaseToken已解码){
字符串uid=decodedToken.getUid();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
e、 printStackTrace();
}
});
我想我做的和firebase网页上提到的一样,但是我得到了上面的错误

有人能帮我吗


谢谢你的帮助

我解决了这个问题

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

Firebase:无法分析服务帐户:必须设置“项目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);…:

我不知道为什么这种行为,但现在起作用了


谢谢你的支持

我解决了这个问题

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

Firebase:无法分析服务帐户:必须设置“项目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);…:

我不知道为什么这种行为,但现在起作用了


谢谢你的支持

您使用的是哪个版本的ADMINJavaSDK?您能否在最新的4.1.5版本上重新编写此文件?另外,您是否确定
“path/to/serviceAccountKey.json”
路径实际上是您的json文件的正确路径?您可能引用了一个不存在的文件。您好,是的,我使用的是firebase admin 4.1.5的最新版本,是的,我的文件路径对应于我的java路径,因此我只指定文件名,事实上在加载文件后,我在控制台中打印它,它就像json文件一样。要立即加载该文件,我使用sameInputStream inputStream=this.getClass().getClassLoader().getResourceAsStream(“/apilogintest-9c5f5-firebase-adminsdk-hhayl-4cbbe5f2.json”);BufferedReader in=新的BufferedReader(新的InputStreamReader(serviceAccount));字符串行=null;while((line=in.readLine())!=null){System.out.println(line);}FirebaseOptions=new FirebaseOptions.Builder().setCredential(FirebaseCredentials.fromCertificate(serviceCount)).setDatabaseUrl(“;initializeApp=FirebaseApp.initializeApp(options)”;您使用的是哪个版本的Admin Java SDK?能否在最新的4.1.5版本上重新编程?另外,您是否确定路径/to/serviceAccountKey.json"path实际上是您的JSON文件的正确路径?您可能引用了一个不存在的文件。您好,是的,我使用的是firebase admin 4.1.5的最新版本,是的,我的文件的路径对应于我的java路径,所以我只指定了我的文件名,事实上,加载文件后,我在控制台中打印它,然后我就可以了它类似于json文件。要立即加载该文件,我将使用sameInputStream inputStream=this.getClass().getClassLoader().getResourceAsStream(“/apilogintest-9c5f5-firebase-adminsdk-hhayl-4C4CBBBE5F2.json”);BufferedReader in=new BufferedReader(new InputReader(serviceAccount));字符串streamline=null;而((line=in.readLine())!=null){System.out.println(line);}FirebaseOptions options=new FirebaseOptions.Builder().setCredential(FirebaseCredentials.fromCertificate(serviceCount)).setDatabaseUrl(“;initializeApp=FirebaseApp.initializeApp(options)”;