如何将Firebase身份验证与Java App Engine(标准)应用程序一起使用?

时间:2017-11-08 21:10:29

标签: java google-app-engine firebase firebase-authentication

是否有一个相对简单的教程和/或示例应用程序,它显示了使用Java App Engine(标准)应用程序执行Firebase身份验证所需的所有步骤?我觉得我已经完成了大部分要求,但我看到以下错误:

java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist. 

我跑的时候:

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();

我的目标是:

 FirebaseToken decodedToken = firebaseAuth.verifyIdTokenAsync(idTokenString).get();
 String userId = decodedToken.getUid();
 UserRecord userRecord = firebaseAuth.getUserAsync(userId).get();

请注意,Firebase Auth是我将在此应用程序中访问的唯一Firebase API或服务,因此我认为我不需要创建Firebase服务帐户并设置应用程序默认凭据。是这样的吗?

实验表明我需要创建Firebase服务帐户并使用服务帐户json凭证文件。如果有某种方法可以避免这样做,我很乐意看到它。

提前致谢。

-Mark

2 个答案:

答案 0 :(得分:0)

我也有类似的情况。经过几个小时的挣扎和一些阅读文档,我发现了这个:https://firebase.google.com/docs/admin/setup

这些文档引用了它:https://firebase.google.com/docs/auth/admin/verify-id-tokens

最后(就像你想的那样)我需要创建一个Firebase服务帐户。这使我可以关注https://firebase.google.com/docs/admin/setup并在我的Java应用程序中初始化我的Firebase应用程序,并且我不再收到错误“FirebaseApp的名称[默认]不存在。”。我现在可以验证ID令牌并通过'verifyIdTokenAsync'从Firebase获取uid。

关于不需要服务帐户的最后一个问题,如果你在google的java应用引擎上运行,我相信你不需要服务帐户。

下面是来自同一设置页面的代码片段,暗示您所要求的内容确实可以完成。我没有在谷歌的Java应用程序引擎上运行所以我无法确认。我希望这会有所帮助。

FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.getApplicationDefault())
.setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
.build();
FirebaseApp.initializeApp(options);

答案 1 :(得分:0)

我还遇到了一个问题,即以某种方式无法在类路径中获取凭据json文件。因此,我使用了Levi's解决方案,更多细节如下:

创建课程:

public class FirebaseCredentialsHelper {

      public String type= "";
      public String project_id= "";
      public String private_key_id= "";
      public String private_key= "";
      public String client_email= "";
      public String client_id= "";
      public String auth_uri= "";
      public String token_uri= "";
      public String auth_provider_x509_cert_url= "";
      public String client_x509_cert_url= "";

}

使用依赖项:

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.5</version>
</dependency>

这就是您进行握手的方式。

Gson gson = new Gson(); 
InputStream stream = new ByteArrayInputStream(gson.toJson(new FirebaseCredentialsHelper()).getBytes(StandardCharsets.UTF_8));
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
FirebaseOptions options = new FirebaseOptions.Builder().setCredentials(credentials).build();