Как я могу получить токен OAuth2 для отправки push-уведомлений через Firebase Cloud Messaging (FCM)?

Google изменил метод отправки пуш-уведомлений, перейдя на авторизацию через OAuth2. В текущем запросе на отправку пуш-уведомлений необходимо указывать заголовок "Authorization" с токеном в формате "Bearer " + token. В инструкции по миграции упоминается, что токен следует получать с помощью библиотеки google-auth-library-php, для чего нужен файл credentials.json, который я уже получил согласно инструкциям.

Я попробовал использовать предоставленный код из примера:

```php
putenv('GOOGLE_APPLICATION_CREDENTIALS=/var/www/html/credentials.json');

$scopes = ['https://www.googleapis.com/auth/drive.readonly'];

$middleware = ApplicationDefaultCredentials::getMiddleware($scopes);
$stack = HandlerStack::create();
$stack->push($middleware);

$client = new Client([
    'handler' => $stack,
    'base_uri' => 'https://www.googleapis.com',
    'auth' => 'google_auth'  // authorize all requests
]);

$response = $client->get('drive/v2/files');
```

В ответ я получил следующее:

```json
{
  "kind": "drive#fileList",
  "etag": "\"skD00QgZZ0FB6U5ufzrrxrFjqyA\"",
  "selfLink": "https://www.googleapis.com/drive/v2/files",
  "incompleteSearch": false,
  "items": []
}
```

Однако в этом ответе отсутствует токен. Как правильно получить OAuth токен для отправки пуш-уведомлений?
  • 9 сентября 2024 г. 12:03
Ответы на вопрос 2
Чтобы получить OAuth2 токен для использования с Firebase Cloud Messaging (FCM) при отправке пуш-уведомлений, вы можете воспользоваться библиотекой `google/auth` (или `google/auth-library-php`), а не `google-api-php-client`, как в вашем примере. Давайте пройдемся по шагам:

1. **Убедитесь, что у вас есть файл `credentials.json`**: Он должен содержать данные вашей службы, с настройками учетной записи. Вы можете создать и скачать этот файл из [Google Cloud Console](https://console.cloud.google.com/).

2. **Установите необходимую библиотеку**: Вы можете установить библиотеку `google/auth` через Composer, если у вас ее еще нет:

   ```bash
   composer require google/auth
   ```

3. **Получите токен OAuth2**: Используйте следующий код, чтобы получить токен для аутентификации при отправке пуш-уведомлений:

   ```php
   require 'vendor/autoload.php';

   use Google\Auth\OAuth2;

   // Укажите путь к вашему credentials.json
   $keyFilePath = '/var/www/html/credentials.json';

   // Создаем объект OAuth2
   $oauth2 = new OAuth2([
       'audience' => 'https://fcm.googleapis.com/',
       'issuer' => 'YOUR_SERVICE_ACCOUNT_EMAIL', // замените на email вашей служебной учетной записи
       'signingAlgorithm' => 'RS256',
       'signingKey' => file_get_contents($keyFilePath),
       'subject' => 'YOUR_SERVICE_ACCOUNT_EMAIL', // Здесь также укажите email вашей службы
       'scope' => 'https://www.googleapis.com/auth/firebase.messaging',
   ]);

   // Получаем токен
   $oauth2->setExpirationTime(3600); // Указываем время жизни токена (по умолчанию 1 час)

   $token = $oauth2->fetchAuthToken();

   // Делаем запрос к FCM
   $authorizationHeader = 'Bearer ' . $token['access_token'];

   // Пример запроса с использованием CURL
   $url = 'https://fcm.googleapis.com/v1/projects/YOUR_PROJECT_ID/messages:send'; // замените на ваш проект

   $data = [ /* ваши данные сообщения */ ];
   $options = [
       'http' => [
           'header' => [
               'Authorization: ' . $authorizationHeader,
               'Content-Type: application/json',
           ],
           'method' => 'POST',
           'content' => json_encode($data),
       ],
   ];

   $context = stream_context_create($options);
   $result = file_get_contents($url, false, $context);

   echo $result; // Ответ от FCM
   ```

   **Обратите внимание**:
   - Замените `YOUR_SERVICE_ACCOUNT_EMAIL` на email вашей службы (это будет что-то вроде `your_service_account@your_project.iam.gserviceaccount.com`).
   - Замените `YOUR_PROJECT_ID` на идентификатор вашего проекта в GCP.
   - Подберите данные для отправки уведомлений в массив `$data`.

Теперь вы получите доступ к вашему токену и сможете отправлять пуш-уведомления через FCM, используя полученный токен в заголовке `Authorization`.
fetchAuthToken 

<?php
require_once 'vendor/autoload.php';

use Google\Auth\Credentials\ServiceAccountCredentials;
use GuzzleHttp\Client;

$serviceAccountFile = '/path-to-credentials.json';
$scopes = ['https://www.googleapis.com/auth/drive.readonly'];
// Учетка
$credentials = new ServiceAccountCredentials(
    $scopes,
    $serviceAccountFile
);
// Получаем токен
$token = $credentials->fetchAuthToken();
$accessToken = $token['access_token'];

echo 'OAuth2 Token: ' . $accessToken;
echo "\n";

// Ну тут по примеру запрашиваем файлы с гугл диска
$client = new Client([
    'base_uri' => 'https://www.googleapis.com',
    'headers' => [
        'Authorization' => 'Bearer ' . $accessToken
    ]
]);

$response = $client->get('/drive/v2/files');
print_r((string) $response->getBody());
Похожие вопросы