У анонимного вызывающего абонента нет доступа storage.objects.create, но у моего JWT есть область действия https://www.googleapis.com/auth/devstorage.full_control

#google-cloud-platform #google-cloud-storage

#google-cloud-platform #google-cloud-storage

Вопрос:

Я следую документации для потока OAuth2 между серверами (создавая свой собственный JWT, а не используя библиотеку).

Я создал учетную запись службы с нужными разрешениями для загрузки в мое хранилище. Я успешно получаю access_token от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;
    }
  

обновление: когда я включаю токен доступа в качестве параметра запроса, как amp;access_token=<access_token> это работает, поэтому по какой-то причине токен доступа не работает как заголовок, и я не могу понять, почему

Update2: я устанавливал заголовки как массив значений ключа, например

 [
   Authorization => Bearer <token>
]
  

Ой, извините, ребята

Комментарии:

1. Не могли бы вы предоставить более подробную информацию о том, как вы вычисляете подпись? Для отладки я предлагаю установить время истечения 3600 с после iat, а также закодировать URL-адрес grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer .

2. Эта ошибка означает, что вы неправильно включаете токен или заголовок отсутствует / неверен. Authorization: bearer <TOKEN>

3. @alextru спасибо, я попробую это сейчас. Я обновил свой пост с помощью функции, которую я использую для вычисления подписи. http_build_query Функция кодирует grant_type Я думал, что, поскольку я успешно получаю access_token обратно, с моим JWT все в порядке, но я могу ошибаться

4. @JohnHanley Я включаю токен в качестве заголовка, подобного такому: Authorization: Bearer <access_token>

5. @alextru @JohnHanley обновление: когда я включаю токен доступа в качестве параметра запроса, как amp;access_token=<access_token> это работает, поэтому по какой-то причине токен доступа не работает как заголовок, и я не могу понять, почему

Ответ №1:

Я устанавливал заголовки как массив значений ключа, например

 [
   Authorization => Bearer <token>
]