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 токен для отправки пуш-уведомлений?
Чтобы получить 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`.
<a href="http://googleapis.github.io/google-auth-library-php/main/Google/Auth/OAuth2.html#method_fetchAuthToken" rel="nofollow">fetchAuthToken</a> <br/> <br/> <pre><code class="php"><?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());</code></pre>