Я следую документации для потока OAuth2 от сервера к серверу (создавая свой собственный JWT вместо использования библиотеки).
Я создал служебную учетную запись с правами доступа для загрузки в мое хранилище. Я успешно получил токен доступа от https://www.googleapis.com/oauth2/v4/token с областью действия https://www.googleapis.com/auth/devstorage.full_control, как описано в документации и с использованием электронной почты учетной записи моей службы.
Когда я добавляю access_token в качестве заголовка моего запроса POST, как описано, я получаю это сообщение об ошибке:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Anonymous caller does not have storage.objects.create access to bucket/object.",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Anonymous caller does not have storage.objects.create access to bucket/object."
}
}
Это моя структура JWT:
$googleJson = json_decode(file_get_contents('/app/config/jwt/google.json'), true);
$time = time();
$headers = [
'alg' => 'RS256',
'typ' => 'JWT'
];
$payload = [
'iss' => $googleJson['client_email'],
'scope' => 'https://www.googleapis.com/auth/devstorage.full_control'
'aud' => 'https://www.googleapis.com/oauth2/v4/token',
'exp' => $time + 120,
'iat' => $time
];
$jwt = JWTService::create($headers, $payload, $googleJson['private_key']);
return http_build_query([
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion' => $jwt
]);
Что мне здесь не хватает? Ясно, что этот access_token должен аутентифицировать мой запрос, но сообщение об ошибке, помечающее запрос как Anonymous caller
, заставляет меня сомневаться, что я вообще не аутентифицировался.
Это функция, которую я использую для создания JWT:
public static function create(array $headers, array $payload, string $privateKey): string
{
$headers = json_encode($headers);
$payload = json_encode($payload);
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($headers));
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
openssl_sign($base64UrlHeader . '.' . $base64UrlPayload, $signature, $privateKey, 'sha256');
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
return $base64UrlHeader . '.' . $base64UrlPayload . '.' . $base64UrlSignature;
}
обновление: когда я включаю токен доступа в качестве параметра запроса, например &access_token=<access_token>
, он работает, поэтому по какой-то причине токен доступа не работает как заголовок, и я не могу понять, почему
Update2: я устанавливал заголовки как массив значений ключей, например
[
Authorization => Bearer <token>
]
Ой, извините, ребята