Google 致力于为黑人社区推动种族平等。查看具体举措

Разрешить отправку запросов

Запросы, отправленные в FCM с сервера приложений или доверенной среды, должны быть авторизованы. Обратите внимание на эти важные различия между устаревшей авторизацией HTTP и HTTP v1 API:

  • API FCM HTTP v1 авторизует запросы с помощью недолговечного токена доступа OAuth 2.0. Чтобы создать этот токен, вы можете использовать учетные данные приложения Google по умолчанию (в серверных средах Google) и / или вручную получить необходимые учетные данные из файла закрытого ключа JSON, созданного для учетной записи службы. Если вы используете Firebase Admin SDK для отправки сообщений, библиотека обрабатывает токен за вас.
  • Устаревшие протоколы могут использовать только долгоживущие ключи API, полученные из консоли Firebase.

Разрешить отправку запросов HTTP v1

В зависимости от деталей вашей серверной среды используйте комбинацию этих стратегий для авторизации серверных запросов к службам Firebase:

  • Учетные данные приложения Google по умолчанию (ADC)
  • JSON-файл сервисного аккаунта
  • Недолговечный токен доступа OAuth 2.0, полученный из учетной записи службы.

Если ваше приложение работает на Compute Engine, Google Kubernetes Engine, App Engine, или облако функций ( в том числе облачных функций для Firebase) Использовать учетные данные приложения по умолчанию (ADC). ADC использует уже существующую учетную запись службы по умолчанию , чтобы получить учетные данные для авторизации запросов и ADC обеспечивает гибкое локальное тестирование с помощью переменного окружения GOOGLE_APPLICATION_CREDENTIALS . Для максимальной автоматизации процесса авторизации используйте ADC вместе с серверными библиотеками Admin SDK.

Если ваше приложение работает на серверной среде без Google, вам необходимо скачать файл в формате JSON учетной записи службы из проекта Firebase. До тех пор , пока у вас есть доступ к файловой системе , содержащей файл секретного ключа, вы можете использовать переменные окружения GOOGLE_APPLICATION_CREDENTIALS для авторизации запросов с этими полученными вручную учетными данными. Если у вас нет такого доступа к файлу, вы должны ссылаться на файл учетной записи службы в своем коде - что следует делать с особой осторожностью из-за риска раскрытия ваших учетных данных.

Предоставьте учетные данные с помощью ADC

Учетные данные приложения Google по умолчанию (ADC) проверяют ваши учетные данные в следующем порядке:

  1. Проверяет , АЦП ли переменная среды GOOGLE_APPLICATION_CREDENTIALS устанавливается. Если переменная установлена, ADC использует файл учетной записи службы, на который указывает переменная.

  2. Если переменная среды не задана, ADC использует учетную запись службы по умолчанию, которую Compute Engine, Google Kubernetes Engine, App Engine и Cloud Functions предоставляют для приложений, работающих в этих службах.

  3. Если ADC не может использовать ни одну из вышеперечисленных учетных данных, система выдает ошибку.

Следующий пример кода Admin SDK иллюстрирует эту стратегию. В примере явно не указаны учетные данные приложения. Однако ADC может неявно находить учетные данные, если установлена ​​переменная среды или пока приложение работает на Compute Engine, Google Kubernetes Engine, App Engine или Cloud Functions.

Node.js

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
});

Джава

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

Идти

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C #

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});

Ввести учетные данные вручную

Firebase проекты поддержка Google учетных записей служб , которые можно использовать для вызова API для сервера Firebase с вашего сервера приложений или доверенной среды. Если вы разрабатываете код локально или развертываете приложение локально, вы можете использовать учетные данные, полученные через эту учетную запись службы, для авторизации запросов к серверу.

Чтобы аутентифицировать учетную запись службы и разрешить ей доступ к службам Firebase, необходимо сгенерировать файл закрытого ключа в формате JSON.

Чтобы сгенерировать файл закрытого ключа для вашей учетной записи службы:

  1. В Firebase консоли откройте Настройки> Учетные записи служб .

  2. Нажмите кнопку Создать новый секретный ключ, а затем подтвердить, нажав Создать ключ.

  3. Надежно храните файл JSON, содержащий ключ.

При авторизации через учетную запись службы у вас есть два варианта предоставления учетных данных вашему приложению. Вы можете либо установить GOOGLE_APPLICATION_CREDENTIALS переменного окружение, или вы можете явно передать путь к ключу учетной записи службы в коде. Первый вариант более безопасен и настоятельно рекомендуется.

Чтобы установить переменную среды:

Установите переменную окружения GOOGLE_APPLICATION_CREDENTIALS к файлу файла JSON , который содержит ключ учетной записи службы. Эта переменная применяется только к вашему текущему сеансу оболочки, поэтому, если вы открываете новый сеанс, установите переменную снова.

Linux или macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Окна

С PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

После того, как вы выполните указанные выше действия, учетные данные приложения по умолчанию (ADC) смогут неявно определить ваши учетные данные, что позволит вам использовать учетные данные учетной записи службы при тестировании или запуске в средах, отличных от Google.

Используйте учетные данные для создания токенов доступа

Если не вы используете Admin SDK , который авторизации ручка автоматически, вам нужно чеканить токена доступа и добавить его для отправки запросов.

Используйте свои учетные данные Firebase вместе с Auth библиотекой Google для предпочитаемого языка , чтобы получить кратковременный доступ OAuth 2.0 лексем:

node.js

 function getAccessToken() {
  return new Promise(function(resolve, reject) {
    const key = require('../placeholders/service-account.json');
    const jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

В этом примере клиентская библиотека Google API аутентифицирует запрос с помощью веб-токена JSON или JWT. Для получения дополнительной информации см JSON веб - маркеры .

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Джава

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

После истечения срока действия вашего токена доступа метод обновления токена вызывается автоматически для получения обновленного токена доступа.

Для того, чтобы разрешить доступ к ТСМ, запросить объем https://www.googleapis.com/auth/firebase.messaging .

Чтобы добавить токен доступа в заголовок HTTP-запроса:

Добавить маркер в качестве значения Authorization заголовка в формате Authorization: Bearer <access_token> :

node.js

headers: {
  'Authorization': 'Bearer ' + accessToken
}

Python

headers = {
  'Authorization': 'Bearer ' + _get_access_token(),
  'Content-Type': 'application/json; UTF-8',
}

Джава

URL url = new URL(BASE_URL + FCM_SEND_ENDPOINT);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestProperty("Authorization", "Bearer " + getAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

Разрешить запросы на отправку устаревшего протокола

С HTTP унаследованного протоколом, каждый запрос должен содержать ключ сервера от Cloud Messaging вкладки на панели Firebase консоли настройки. Для XMPP вы должны использовать тот же ключ сервера, чтобы установить соединение.

Перенести устаревшие серверные ключи

Начиная с марта 2020 года FCM перестала создавать устаревшие серверные ключи. Существующие ключи устаревших серверов будут продолжать работать, но мы рекомендуем использовать вместо этого новой версии ключа маркирован ключ сервера в консоли Firebase .

Если вы хотите удалить существующий ключ старого сервера, вы можете сделать это в Google Cloud Console .

Авторизовать HTTP-запросы

Запрос сообщения состоит из двух частей: заголовка HTTP и тела HTTP. Заголовок HTTP должен содержать следующие заголовки:

  • Authorization : ключ = YOUR_SERVER_KEY
    Убедитесь в том , что это ключ сервера, значение которого доступно в Cloud Messaging вкладку на панели Firebase консоли настройки. Ключи Android, iOS и браузера отклоняются FCM.
  • Content-Type : application/json для JSON; application/x-www-form-urlencoded;charset=UTF-8 , для обычного текста.
    Если Content-Type опущен, то предполагается , что формат будет простой текст.

Например:

Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    ...
  },
}

См Сложения Отправлять запросы на полную детализацию по созданию отправки запросов. Наследство HTTP Protocol Reference содержит список всех параметров , ваше сообщение может содержать.

Проверка действительности ключа сервера

Если вы получаете ошибки аутентификации при отправке сообщений, проверьте действительность ключа вашего Сервера. Например, в Linux выполните следующую команду:

api_key=YOUR_SERVER_KEY

curl --header "Authorization: key=$api_key" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"registration_ids\":[\"ABC\"]}"

Если вы получили код состояния 401 HTTP, ваш ключ сервера недействителен.

Авторизовать соединение XMPP

С помощью XMPP вы можете поддерживать постоянное, асинхронное, двунаправленное соединение с серверами FCM. Соединение можно использовать для отправки и получения сообщений между вашим сервером и устройствами, подключенными к FCM ваших пользователей.

Вы можете использовать большинство библиотек XMPP для управления долгоживущим подключением к FCM. XMPP конечных точек трассы в fcm-xmpp.googleapis.com:5235 . При тестировании функциональности с пользователями непроизводственными, вместо него вы должны подключиться к серверу предварительного производства на fcm-xmpp.googleapis.com:5236 (обратите внимание на другой порт).

Регулярное тестирование на этапе подготовки к производству (меньшая среда, в которой работают последние сборки FCM) полезно для изоляции реальных пользователей от тестового кода. Тестовые устройства и код проверки подключения к fcm-xmpp.googleapis.com:5236 следуют использовать другой ТСМ идентификатор отправителя , чтобы избежать каких - либо рисков посылки тестовых сообщений пользователей производства или отправок сообщения , вверх по течению от производственного трафика по тестовым соединениям.

К подключению предъявляются два важных требования:

  • Вы должны инициировать соединение Transport Layer Security (TLS). Обратите внимание , что ТСМ в настоящее время не поддерживает расширение STARTTLS .
  • FCM необходим механизм аутентификации SASL PLAIN , используя <your_FCM_Sender_Id>@fcm.googleapis.com (ТСМ идентификатор отправителя ) и ключ сервера в качестве пароля. Эти значения доступны в Cloud Messaging вкладки на панели Firebase консоли настройки.

Если в какой-то момент соединение не удастся, вы должны немедленно восстановить соединение. Нет необходимости отступать после отключения, которое происходит после аутентификации. Для каждого идентификатора отправителя , ТСМ позволяет 2500 соединений параллельно.

Следующие ниже фрагменты иллюстрируют, как выполнить аутентификацию и авторизацию для подключения XMPP к FCM.

XMPP сервер

Сервер XMPP запрашивает соединение с FCM

<stream:stream to="fcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

FCM

FCM открывает соединение и запрашивает механизм аутентификации, в том числе PLAIN метода.

<stream:features>
  <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
    <mechanism>X-OAUTH2</mechanism>
    <mechanism>X-GOOGLE-TOKEN</mechanism>
    <mechanism>PLAIN</mechanism>
  </mechanisms>
</stream:features>

XMPP сервер

Сервер XMPP должен ответить , используя PLAIN метод аутентификации, обеспечивая ключ сервера от Cloud Messaging вкладки на панели Firebase консоли настройки.

<auth mechanism="PLAIN"
xmlns="urn:ietf:params:xml:ns:xmpp-sasl">MTI2MjAwMzQ3OTMzQHByb2plY3RzLmdjbS5hb
mFTeUIzcmNaTmtmbnFLZEZiOW1oekNCaVlwT1JEQTJKV1d0dw==</auth>

FCM

<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>

XMPP сервер

<stream:stream to="fcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

FCM

<stream:features>
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
  <session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</stream:features>

XMPP сервер

<iq type="set">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"></bind>
</iq>

FCM

<iq type="result">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
    <jid>SENDER_ID@fcm.googleapis.com/RESOURCE</jid>
  </bind>
</iq>

Примечание. FCM не использует связанный ресурс при маршрутизации сообщений.

См Сложения Отправлять запросы на полную детализацию по созданию отправки запросов. Наследие XMPP протокол Ссылка содержит список всех параметров , ваше сообщение может содержать.