匿名调用者没有storage.objects.create访问权限但我的JWT具有范围https://www.googleapis.com/auth/devstorage.full_control

问题描述 投票:0回答:1

我正在关注服务器到服务器OAuth2流的documentation(创建我自己的JWT而不是使用库)。

我创建了一个具有正确权限的服务帐户,可以上传到我的存储桶。我成功地从https://www.googleapis.com/oauth2/v4/token获取了一个access_token,其范围为https://www.googleapis.com/auth/devstorage.full_control,如文档中所述并使用我的服务帐户的电子邮件。

当我按照描述在我的POST请求中添加access_token作为标题时,我收到以下错误消息:

{
 "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>
]

哎呀,对不起伙计们

google-cloud-platform google-cloud-storage
1个回答
1
投票

我将标题设置为键值数组

[
   Authorization => Bearer <token>
]
© www.soinside.com 2019 - 2024. All rights reserved.