Как использовать Firebase Admin SDK в Spring MVC - PullRequest
0 голосов
/ 17 января 2019

Я не понимаю, как настроить Firebase Admin в моей службе Spring MVC Rest. Мне нужна проверка токена. Для тестов я использовал это в моем контроллере:

@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] уже существует! когда я отправляю более одного запроса.

Моя проблема в том, что я не понимаю, как сделать проверку для каждого запроса.

Я использую Model Repository Controller

1 Ответ

0 голосов
/ 17 января 2019

Прямо сейчас ваш код пытается инициализировать 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, чтобы ответить, как это сделать, но эта статья показывает некоторые многообещающие подходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...