[英]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.