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

时间:2019-04-23 07:40:50

标签: google-cloud-platform google-cloud-storage

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

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

当我按照所述在我的POST请求上将access_token添加为标头时,我收到此错误消息:

npm run start

这是我的JWT结构:

{
 "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."
 }
}

我在这里想念什么?显然,这个access_token应该对我的请求进行身份验证,但是将请求标记为$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 ]); 的错误消息使我怀疑我根本没有经过身份验证。

这是我用来创建JWT的功能:

Anonymous caller

更新:当我将访问令牌作为查询参数(如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; } )包含在内时,它可以工作,因此由于某种原因,访问令牌不能用作标头,并且我不知道为什么

Update2:我正在将标头设置为键值数组,例如

&access_token=<access_token>

糟糕,对不起!

1 个答案:

答案 0 :(得分:1)

我将标头设置为键值数组,例如

[
   Authorization => Bearer <token>
]