Firebase未在Java中加载凭据



我使用Firebase处理Java web应用程序中的身份验证,使用Spring Boot和Thymelaf。我只启用了谷歌登录。

在前端,我设法使Firebase正常工作,并对用户进行身份验证。所以前端很好。

当涉及到在后端验证令牌时,我尝试按照文档中的建议使用Firebase Admin SDK。

https://firebase.google.com/docs/admin/setup

我使用的是迄今为止最新的版本。

compile('com.google.firebase:firebase-admin:4.1.1')

我正在后端初始化Firebase,然后使用Javascript验证我在前端获得的Google令牌,并在POST请求中传递给后端。

https://firebase.google.com/docs/auth/admin/verify-id-tokens

问题是,Firebase似乎没有从您必须为应用程序下载的凭据文件中加载凭据(如何获取凭据文件在上面的第一个链接中有介绍,它只是一个JSON文件,包含type、project_id、private_key等内容)。

try (FileInputStream serviceAccount = new FileInputStream(credentialsFilePath)) {
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
.setDatabaseUrl(databaseURL)
.build();
FirebaseApp.initializeApp(options);
} catch (IOException e) {
LOG.error("Firebase credentials file not found");
throw e;
}

它肯定是在查找文件,但当我检查凭据时,它们的值为null,当我尝试验证令牌时,我会得到这个异常。

java.lang.IllegalArgumentException: projectId must be set
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
at com.google.firebase.auth.internal.FirebaseTokenVerifier.<init>(FirebaseTokenVerifier.java:50)
at com.google.firebase.auth.internal.FirebaseTokenVerifier$Builder.build(FirebaseTokenVerifier.java:212)
at com.google.firebase.auth.FirebaseAuth$2.then(FirebaseAuth.java:156)
at com.google.firebase.auth.FirebaseAuth$2.then(FirebaseAuth.java:152)
at com.google.firebase.tasks.ContinueWithCompletionListener$1.run(ContinueWithCompletionListener.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

我已经阅读了文档,并查看了他们GitHub存储库中的示例,但他们似乎没有在web应用程序中使用Java的Firebase的完整工作示例。

所以问题是,我该如何让它发挥作用?在这种情况下,人们是如何使用Firebase的?

谢谢。

附言1:我没有在谷歌云平台上运行应用程序,所以我不能使用FirebaseCredentials.applicationDefault()让谷歌自动加载凭据。

p.S.2:我不得不将模块"guava-jdk5"从Firebase依赖项中排除,因为我也在使用spring数据弹性搜索,但由于依赖项冲突,它不起作用。但我的类路径中仍然有番石榴:18.0。

验证下载的密钥文件是否是最新的,如果不确定,请再次尝试下载,验证数据库url是否使用您的projectId更新。

尝试将文件复制到任何resources目录,通过构建将其复制到任何模块jar或WEB-INF/类中,然后使用class.getResourceAsStream()

private void initFireBaseServiceAccount() {
InputStream serviceAccount =
this.getClass().getResourceAsStream("/PROJECTID-firebase-adminsdk-service-account.json");
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
.setDatabaseUrl("https://PROJECTID.firebaseio.com")
.build();
FirebaseApp.initializeApp(options);
}

将cred文件保存在类路径中,并用class.getResourceAsStream()加载它,并初始化FirebaseApp对我的应用程序有效。

注意:我是firebase的新手,通过在本地机器中启动dev服务器来测试这一点。

最新更新