【问题标题】:Firebase Auth not getting initialized in spring bootFirebase Auth 未在 Spring Boot 中初始化
【发布时间】:2020-12-14 13:55:30
【问题描述】:

我在我的 Spring Boot 应用程序中使用了 firebase admin sdk。 (API 应用)

当我在 intelliJ 本地运行时,它工作正常。但是当部署在 tomcat 中时,它给了我 NPE。

在 Springboot 应用中

 public static void main(String[] args) {
    SpringApplication.run(InfanoApplication.class, args);

    try {
        ClassLoader classloader = Thread.currentThread().getContextClassLoader();

        File file = new File(classloader.getResource("firebase2.json").getFile());
        logger.info("FILE PATH : " + file.getAbsolutePath());
        FileInputStream serviceAccount = new FileInputStream(file.getAbsolutePath());

        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl(FB_BASE_URL)
                .build();

        firebaseApp = FirebaseApp.initializeApp(options);
        logger.info("FIREBASE NAME : "+firebaseApp.getName());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在 API 代码中

userRecord = FirebaseAuth.getInstance(InfanoApplication.firebaseApp).getUserByPhoneNumber(mobile);

错误:

java.lang.NullPointerException
at com.google.firebase.ImplFirebaseTrampolines.getService(ImplFirebaseTrampolines.java:62)
at com.google.firebase.auth.FirebaseAuth.getInstance(FirebaseAuth.java:101)

谁能帮忙解决这个问题。提前谢谢你。

【问题讨论】:

  • NPE 抱怨的 null 是什么?
  • @DougStevenson FirebaseAuth.getInstance 正在返回 null

标签: java firebase spring-boot firebase-authentication firebase-admin


【解决方案1】:

您不应该在 main 方法中创建这样的 Firebase 实例。可能在正确的类路径中找不到您的服务帐户。我会创建一个Spring Configuration,它会在应用程序启动时创建一个 Firebase 应用程序。我将我的服务帐户保存在 resources 文件夹的根目录中。

@Configuration
public class FirebaseConfig {

    //TODO: In your case maybe something else
    @Value(value = "classpath:serviceAccount.json")
    private Resource serviceAccountResource;

    @Bean
    public FirebaseApp createFireBaseApp() throws IOException {
        InputStream serviceAccount = serviceAccountResource.getInputStream();

        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("<db-url>")
                .setStorageBucket("<storage-url>")
                .build();

        //Add loggers
        System.out.println("Firebase config initialized");

        return FirebaseApp.initializeApp(options);
    }

    
    @Bean
    @DependsOn(value = "createFireBaseApp")
    public StorageClient createFirebaseStorage() {
        return StorageClient.getInstance();
    }

    @Bean
    @DependsOn(value = "createFireBaseApp")
    public FirebaseAuth createFirebaseAuth() {
        return FirebaseAuth.getInstance();
    }

    @Bean
    @DependsOn(value = "createFireBaseApp")
    public FirebaseDatabase createFirebaseDatabase() {
        return FirebaseDatabase.getInstance();
    }

    @Bean
    @DependsOn(value = "createFireBaseApp")
    public FirebaseMessaging createFirebaseMessaging() {
        return FirebaseMessaging.getInstance();
    }
}

现在,如果我想在我的任何服务类中使用 Firebase 身份验证,我只需执行以下操作:

@Service
class MyService {

    @Autowired
    private FirebaseAuth firebaseAuth;

    //TODO: Probably should have return type
    public void findUser(String mobile) {
        firebaseAuth.getUserByPhoneNumber(mobile);
    }
}

【讨论】:

  • 我只是按照您的步骤操作,但出现以下错误。 java.lang.NoSuchMethodError: 'long com.google.common.io.ByteStreams.exhaust(java.io.InputStream)'
  • 抱歉,该问题是由于 firebase admin sdk 版本从 6.13.0 更改为 7.0.0。一旦恢复版本,该问题就消失了。
猜你喜欢
  • 2018-05-29
  • 2018-01-20
  • 2015-07-29
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
相关资源
最近更新 更多