0

.jpegファイルをGoogleクラウドストレージにアップロードしようとしていますが、次の401エラーでリクエストが失敗します。401エラーが発生する理由:匿名ユーザーにバケットへのstorage.objects.createアクセスがありません

私のPOSTリクエストは次のようになります。

<form id="upload_image_form" class="" action="https://www.googleapis.com/upload/storage/v1/b/XXXtest/o?uploadType=media&name=myObject" method="post" enctype="multipart/form-data"> 
    <input id="image" name="image" type="file" accept="image/x-png, image/jpeg, image/png" onchange=""> 

    <input type="hidden" name="Content-Type" value="image/jpeg"> 
    <input type="hidden" name="name" value="my_name"> 
    <input type="hidden" name="Accept" value="application/json, text/json, text/x-json, text/javascript"> 
    <input type="hidden" name="host" value="www.googleapis.com"> 
    <input type="hidden" name="Transfer-Encoding" value="chunked"> 
    <input type="hidden" name="Authorization" value="<?php echo 'Bearer'.' '.$_SESSION['access_token']['access_token']; ?>"> 
    <input type="hidden" name="Expect" value="100-continue"> 
    <input type="hidden" name="Accept-Encoding" value="gzip, deflate"> 
    <input type="hidden" name="Connection" value="Keep-Alive"> 
    <input type="hidden" name="acl" value="bucket-owner-writer"> 
    <input id="upload" name="upload" value="Upload" type="submit" style="position: absolute;"> 

</form> 

あなたはこのdocumentationによると、私が何をしないのです教えてくださいことはできますか?

+1

あなたはACLをチェック/設定しましたか? https://cloud.google.com/storage/docs/access-control/create-manage-lists –

+3

おっと、あなたは本当にこれをしたくありません!あなたはフォームのエンド・ユーザーにアクセス・トークンを渡しています。それはうまくいかないだけでなく、そのページを閲覧する人に、そのユーザーの資格情報で必要なものを実行するために使用できるトークンも与えます。これは、HTMLコメントにあなたのパスワードを含めるようなものです。 –

+0

こんにちは@DanCornilescuええ私は値 "バケツ所有者ライター"で設定しますが、それでも動作しません。 – MKB

答えて

1

ユーザーがフォームPOSTを使用してオブジェクトをGCSにアップロードできるようにするには、ユーザーがアップロードできるオブジェクトの種類を記述した「ポリシー文書」を作成して署名し、フォーム内のパラメータ。あなたはここにPOSTを経由してGCSにアップロードについての詳細を読むことができます:https://cloud.google.com/storage/docs/xml-api/post-object

そしてノートここに署名した政策文書で特にセクション:https://cloud.google.com/storage/docs/xml-api/post-object#policydocument

は、ここで例の政策文書です:

{"expiration": "2010-06-16T11:11:11Z", 
"conditions": [ 
    ["starts-with", "$key", "" ], 
    {"acl": "bucket-owner-read" }, 
    {"bucket": "travel-maps"}, 
    {"success_action_redirect": "http://www.example.com/success_notification.html" }, 
    ["eq", "$Content-Type", "image/jpeg" ], 
    ["content-length-range", 0, 1000000] 
    ] 
} 

あなたがしたいですそのドキュメントをbase64し、その結果をユーザーがアップロードの目的で行動させたいサービスアカウントの秘密鍵で署名し、次のように非表示のフィールドに提供します:

<input type="hidden" name="policy" value="eyJleHBpcmF0aW9uIjogIjIwMTAtMDYtMTZUMTE6MTE6MTFaIiwNCiAiY29uZGl0aW9ucyI6IFsNCiAgWyJzdGFydHMtd2l0aCIsICJrZXkiLCAiIiBdLA0KICB7ImFjbCI6ICJidWNrZXQtb3duZXItcmVhZCIgfSwNCiAgeyJidWNrZXQiOiAidHJhdmVsLW1hcHMifSwNCiAgeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N1Y2Nlc3Nfbm90aWZpY2F0aW9uLmh0bWwiIH0sDQogIFsiZXEiLCAiQ29udGVudC1UeXBlIiwgImltYWdlL2pwZWciIF0sDQogIFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCAxMDAwMDAwXQ0KICBdDQp9"> 
<input type="hidden" name="signature" value="BSAMPLEaASAMPLE6SAMPLE+SAMPPLEqSAMPLEPSAMPLE+SAMPLEgSAMPLEzCPlgWREeF7oPGowkeKk7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9sFpqXsQI8IQi1493mw="> 
+0

こんにちはブランドン。この有用な情報をありがとう。私はGoogleの雲に新しいです。私はこの文書の作成方法を知らない(愚かな質問かもしれない)。上記の設定でファイルを作成し、コード化されたファイルパスを含めるか、コード内に何か他の処理を行う必要があるかどうかを知ることができますか? – MKB

+1

ポリシー・ドキュメントは、base64を使用してエンコードされたJSON文字列であり、POST要求の一部としてGCSに隠れた入力として渡されます。コード内で定数として宣言することもできますし、そうでなければJSONとbase64ライブラリを使って生成することもできます。 –

関連する問題