У анонимного абонента нет доступа к storage.objects.create, но мой JWT имеет область действия https://www.googleapis.com/auth/devstorage.full_control - PullRequest
0 голосов
/ 23 апреля 2019

Я следую документации для потока 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>
]

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

1 Ответ

1 голос
/ 24 апреля 2019

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

[
   Authorization => Bearer <token>
]
...