Firebase admin sdk java клиент неожиданно начал возвращать ошибку 401 с кодом состояния unknown-error - PullRequest
1 голос
/ 09 февраля 2020

Я использую firebase admin sdk to pu sh мобильных уведомлений (облачные сообщения firebase). Я успешно настроил его, и он работал около года на облачном движке Google kubernetes. Затем он перестал работать. Вот трассировка стека, которую я получаю на бэкэнде:

com.google.firebase.messaging.FirebaseMessagingException: Unexpected HTTP response with status: 401; body: null
        at com.google.firebase.messaging.FirebaseMessagingClientImpl.newException(FirebaseMessagingClientImpl.java:307) ~[firebase-admin-6.12.1.jar!/:na]
        at com.google.firebase.messaging.FirebaseMessagingClientImpl.createExceptionFromResponse(FirebaseMessagingClientImpl.java:212) ~[firebase-admin-6.12.1.jar!/:na]
        at com.google.firebase.messaging.FirebaseMessagingClientImpl.send(FirebaseMessagingClientImpl.java:128) ~[firebase-admin-6.12.1.jar!/:na]
        at com.google.firebase.messaging.FirebaseMessaging$1.execute(FirebaseMessaging.java:139) ~[firebase-admin-6.12.1.jar!/:na]
        at com.google.firebase.messaging.FirebaseMessaging$1.execute(FirebaseMessaging.java:136) ~[firebase-admin-6.12.1.jar!/:na]
        at com.google.firebase.internal.CallableOperation.call(CallableOperation.java:36) ~[firebase-admin-6.12.1.jar!/:na]
        at com.google.firebase.messaging.FirebaseMessaging.send(FirebaseMessaging.java:106) ~[firebase-admin-6.12.1.jar!/:na]
        at com.google.firebase.messaging.FirebaseMessaging.send(FirebaseMessaging.java:90) ~[firebase-admin-6.12.1.jar!/:na]

Код состояния от FirebaseMessagingException - unknown-error. Я использую зависимость gradle com.google.firebase:firebase-admin:6.12.1.

Мой серверный код инициализации FirebaseApp (kotlin):

val credentials = GoogleCredentials
        .fromStream(FileInputStream(firebaseAppCredentials))
        .createScoped(Arrays.asList("https://www.googleapis.com/auth/firebase.messaging"))
val options = FirebaseOptions.builder()
        .setCredentials(credentials)
        .build()
val firebaseApp = FirebaseApp.initializeApp(options)

Я подтвердил, что firebaseAppCredentials содержит путь к файлу с Учетная запись службы firebase . Вот код отправки (kotlin):

val message = Message.builder()
        .setNotification(notification)
        .setToken(registrationToken)
        .build()
FirebaseMessaging.getInstance(firebaseApp).send(message)

Можете ли вы помочь узнать, как это можно исправить?

1 Ответ

0 голосов
/ 24 февраля 2020

Я реализовал raw-протокол (raw http-запросы), и он начал работать. По некоторым причинам библиотека Firebase Admin SDK java не использовала токен аутентификации в запросе http. Я подозреваю, что это связано с тем, что я настроил GOOGLE_APPLICATION_CREDENTIALS evn var для служебной учетной записи из проекта gcloud, но приложение firebase было инициализировано с служебной учетной записью из проекта firebase. Это намеренно, я использую несколько проектов gcloud, но для FCM используется только один проект.

Похоже, что в com.google.firebase:firebase-admin:6.12.1 есть какая-то ошибка / особенность, и она воспроизводится только в облачной среде.

...