繁体   English   中英

如何在Spring MVC中使用Firebase Admin SDK

[英]How to use Firebase Admin SDK in Spring MVC

我不了解如何在Spring MVC Rest服务中配置Firebase Admin。 我需要令牌验证。 对于测试,我在控制器中使用了它:

@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
public  List<Subscription> getTest(@RequestHeader("token") String idToken) throws FirebaseAuthException {

    String DATABASE_URL = "https://name.firebaseio.com/";

    try {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream inputStream = classLoader.getResourceAsStream("token.json");

        FirebaseOptions options = new FirebaseOptions.Builder()
        .setCredentials( GoogleCredentials.fromStream(inputStream))
                .setDatabaseUrl(DATABASE_URL)
                .build();
        FirebaseApp.initializeApp(options);
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Error loading database");
    }


        FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
        String uid = decodedToken.getUid();

       return service.getAll();
}

但是它返回java.lang.IllegalStateException:FirebaseApp名称[DEFAULT]已经存在! 当我发送多个请求时。

我的问题是,我不了解如何对每个请求进行验证。

我使用模型服务存储库控制器

现在,您的代码尝试为每个请求初始化FirebaseApp 这不是必需的,实际上是不允许的(如错误消息所示)。 最简单的解决方法是检查FirebaseApp是否已使用以下方法初始化:

if (FirebaseApp.getApps().isEmpty()) {
    String DATABASE_URL = "https://name.firebaseio.com/";
    try {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream inputStream = classLoader.getResourceAsStream("token.json");

        FirebaseOptions options = new FirebaseOptions.Builder()
        .setCredentials( GoogleCredentials.fromStream(inputStream))
                .setDatabaseUrl(DATABASE_URL)
                .build();
        FirebaseApp.initializeApp(options);
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Error loading database");
    }
}
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();

return service.getAll();

但这仍然会在每次调用时检查FirebaseApp ,并且说实话只是使此方法的代码大于所需的代码。 因此,最好绑定控制器的生命周期,并仅在创建控制器时运行初始化FirebaseApp的代码。 我对Spring没有足够的知识来回答如何做到这一点,但是本文展示了一些有前途的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM