Я новичок в Firebase, и я сталкиваюсь с ошибками, такими как идентификатор отправителя mismatch и Error Authentication Error с HTTP-статусом 401, когда мое приложение Java пытается отправить уведомление/сообщение, используя токен клиента Firebase. Обратите внимание, что с помощью Firebase Console я могу отправить сообщение клиенту.
Для клиентского приложения я сделал следующее:
- Клонированное приложение для быстрого
messaging
Firebase отсюда - https://github.com/firebase/quickstart-android/tree/master/messaging - которое уже настроено с зависимостями Firebase и т.д. Загрузило клонированное приложение вAndroid Studio
. - Используя Firebase Console, вы создали новый проект под названием
My Notification Client
и добавили приложение, используяcom.google.firebase.quickstart.fcm
качестве имени пакета приложения для Android. - Загруженный файл
google-services.json
для приложения Android добавлен во вновь созданный проект и скопировал его в папкуmessaging/app/
и синхронизировал его с файлами Grade изAndroid Studio
. - Создал эмулятор и запускал приложение из
Android Studio
. Когда приложение загрузилось в эмулятор, нажмите кнопку "Log Token
, чтобы зафиксировать токен клиента Firebase на вкладке "Android Monitor
" вAndroid Studio
. - Используя Firebase Console, вы выбрали недавно созданный проект "
My Notification Client
, щелкнули ссылку "Notifications
на левой панели и отправили уведомление на устройство, вставив токен Firebase, записанный на предыдущем шаге.
Это здорово! Следующим шагом было использование отдельного простого Java-приложения (которое в конечном итоге стало сервером уведомлений) для отправки уведомления клиенту вместо использования Firebase Console.
Чтобы выполнить это, я выполнил описанные здесь шаги - https://firebase.google.com/docs/server/setup#prerequisites. В частности, это шаги, которые я выполнил:
- Создал новый проект под названием
My Notification Server
в Firebase Console. - Используя "
Settings > Permissions
в Firebase Console, создайте новую учетную запись службы и загрузите файлserviceAccountCredentials.json
. - Создал новый проект maven в Eclipse и добавил следующие значения в pom.xml:
<dependency>
<groupId>com.google.gcm</groupId>
<artifactId>gcm-server</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-server-sdk</artifactId>
<version>3.0.0</version>
</dependency>
-
Затем я расширил
com.google.android.gcm.sender.Sender
чтобы создатьFCMSender
и переопределить защищенный методgetConnection(String url)
чтобы использовать новую конечную точку FCM, как показано ниже:class FCMSender extends Sender { public FCMSender(String key) { super(key); } @Override protected HttpURLConnection getConnection(String url) throws IOException { String fcmUrl = "https://fcm.googleapis.com/fcm/send"; return (HttpURLConnection) new URL(fcmUrl).openConnection(); } }
-
Метод
main()
моего Java-приложения выглядит следующим образом:public static void main(String[] args) { // Obtain serverKey from Project Settings -> Cloud Messaging tab // for "My Notification Client" project in Firebase Console. String serverKey = <get_server_key_from_firebase_console>; Thread t = new Thread() { public void run(){ try { Sender sender = new FCMSender(serverKey); Message message = new Message.Builder() .collapseKey("message") .timeToLive(3) .delayWhileIdle(true) .addData("message", "Notification from Java application"); .build(); // Use the same token(or registration id) that was earlier // used to send the message to the client directly from // Firebase Console Notification tab. Result result = sender.send(message, "APA91bFfIFjSCcSiJ111rbmkpnMkZY-Ej4RCpdBZFZN_mYgfHwFlx-M1UXS5FqDBcN8x1efrS2md8L9K_E9N21qB-PIHUqQwmF4p7Y3U-86nCGH7KNkZNjjz_P_qjcTR0TOrwXMh33vp", 1); System.out.println("Result: " + result.toString()); } catch (Exception e) { e.printStackTrace(); } }; t.start; try { t.join(); } catch (InterruptedException iex) { iex.printStackTrace(); } }
Когда я запускаю приложение Java, я получаю ошибку MismatchSenderId
. Я попытался устранить неполадки с помощью curl
как показано ниже, но получил ту же ошибку:
$ skey=<obtained_from_project_settings_cloud_messaging_tab_in_firebase_console>
$ curl -X POST --header "Authorization: key=$skey" \
--Header "Content-Type: application/json" \
https://fcm.googleapis.com/fcm/send \
-d "{\"to\":\"APA91bFfIFjSCcSiJ111rbmkpnMkZY-Ej4RCpdBZFZN_mYgfHwFlx-M1UXS5FqDBcN8x1efrS2md8L9K_E9N21qB-PIHUqQwmF4p7Y3U-86nCGH7KNkZNjjz_P_qjcTR0TOrwXMh33vp\",\"data\":{\"message\":\"Yellow\"}}"
{"multicast_id":7391851081942579857,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
Вместо использования Server Key
указанного в Project Settings > Cloud Messaging
вкладка " Project Settings > Cloud Messaging
" для проекта " My Notification Server
" в Firebase Console, я попытался использовать Project Number
но вызвал InvalidRequestException: HTTP Status Code: 401
.
Firebase документация кодов ошибок говорит о MismatchSenderId
:
error:MismatchSenderId
Mistatched Sender 200 +error:MismatchSenderId
Маркер регистрации привязан к определенной группе отправителей. Когда клиентское приложение регистрируется для FCM, оно должно указать, какие отправители могут отправлять сообщения. Вы должны использовать один из этих идентификаторов отправителя при отправке сообщений в клиентское приложение. Если вы переключитесь на другого отправителя, существующие токены регистрации не будут работать.
Я не мог понять, где/как в Firebase Console можно настроить приложение Android (которое было включено в проект My Notification Client
), чтобы получать сообщения.
Любая помощь по этому поводу была бы оценена!