我不了解如何在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不够了解,无法回答如何做,但是本文显示了一些有前途的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句