Google 致力于为黑人社区推动种族平等。查看具体举措
Эта страница переведена с помощью Cloud Translation API.
Switch to English

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

Запросы, отправленные в 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. ADC проверяет, установлена ​​ли переменная среды 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 или явно передать путь к ключу учетной записи службы в коде. Первый вариант более безопасен и настоятельно рекомендуется.

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

Задайте для переменной среды 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 вместе с клиентской библиотекой Google API для предпочтительного языка, чтобы получить недолговечный токен доступа 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 {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

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

Чтобы разрешить доступ к FCM, запросите область 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 : ключ = ВАШ_СЕРВЕР_КЛЮЧ
    Убедитесь, что это ключ сервера , значение которого доступно на вкладке 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 предоставляет список всех параметров, которые может содержать ваше сообщение.

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

Если вы получаете ошибки аутентификации при отправке сообщений, проверьте действительность ключа вашего Сервера. Например, в 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-xmpp.googleapis.com:5236 (обратите внимание на другой порт).

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

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

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

Если в какой-то момент соединение не удастся, вы должны немедленно восстановить соединение. Нет необходимости отступать после отключения, которое происходит после аутентификации. Для каждого идентификатора отправителя FCM допускает 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 предоставляет список всех параметров, которые может содержать ваше сообщение.