Сообщения протокола REST HTTPS v1 для Firebase Cloud Messenger: отправьте сообщение 403 PERMISSION_DENIED с маркером носителя OAuth2.0 - PullRequest
0 голосов
/ 01 мая 2019

Мы пытаемся использовать новый протокол HTTPSv1 FCM (Firebase Cloud Messaging). Наша команда застряла с ошибкой PERMISSION_DENIED (точный ответ об ошибке показан в конце вопроса). Я пытаюсь решить эту проблему с разрешениями, чтобы успешно получить доступ к функциям отправки уведомлений FCM. Мы используем метод аутентификации учетной записи службы для создания временных токенов OAuth2.0.

Эта сборка предназначена для нового REST API нашей компании. В нашем старом API мы использовали устаревший HTTP-протокол FCM. Мы пытаемся использовать новый протокол v1 для включения новых возможностей FCM. Согласно документации Google, вы можете установить переменную ENV или использовать файл PEM. Мы используем файл PEM для аутентификации.

Извлечение токена канала-носителя FCM OAuth2.0 с помощью PEM (расположение файла скрыто):

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(
      'FILE_LOCATION', 'https://www.googleapis.com/auth/firebase.messaging')
    access_token_info = credentials.get_access_token()
    return access_token_info.access_token

Этот вызов функции возвращает токен канала-носителя (см. Частичный токен в заголовке запроса ниже). Однако, исходя из того, что мы видим, возможно, что этот токен может быть как-то недействительным. Однако в настоящее время мы не знаем, как проверить целостность сгенерированного токена. Мы также попытались отправить полезную нагрузку запроса только с помощью токена и ничего больше. это привело к тому же точному ответу на ошибку, показанному ниже.

Вот как выглядит наш запрос:

URL запроса (скрытый идентификатор проекта):

https://fcm.googleapis.com/v1/projects/MY_PROJECT_ID/messages:send

Заголовок запроса (токен обфусцирован):

{
    'Authorization': 'Bearer ya29.c.Elr8BtoLt0mVEi8zm6C...aeLhcCc', 
    'Content-Type': 'application/json; UTF-8'
}

Запрос полезной нагрузки (скрытая конфиденциальная информация):

{
    "message": {
        "token": "cwJSRdMD6NE:APA...FXoRRl2OgkmCShQixcXxdS_Ie6",
        "notification": {
            "body": "Beach...ast)",
            "title": "RA"
        },
        "data": {
            "key": "value"
        },
        "android": {
            "priority": "high"
        },
        "apns": {
            "headers": {
                "apns-priority": "10"
            }
        },
        "webpush": {
            "headers": {
                "Urgency": "high"
            }
        }
    }
}

Ожидаемые результаты:

Успешный ответ с кодом состояния HTTPS 200

{
    "name": "projects/MY_PROJECT_ID/messages/MESSAGE_ID"
}

Фактические результаты:

{
    "error": {
        "code": 403,
        "message": "The caller does not have permission",
        "status": "PERMISSION_DENIED"
    }
}

В отличие от предыдущих сообщений об ошибках, на этот раз в ответе отсутствует атрибут подробностей. Любой совет / помощь будет высоко ценится!

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