私のアプリケーションのユーザーが署名付きURLを使用してPUT requestを使用しているGCSに直接ファイルをアップロードできるようにします。 Pythonで私のコードは次のようになります。クライアント側で署名付きURLをGCSで使用すると署名が一致しない
def get(self):
base_url = 'https://storage.googleapis.com/' + self.get_bucket_name()
expiration = utils.unix_time_secs(datetime.now() + timedelta(hours=1))
string_to_sign = ( 'PUT' + "\n" +
'' + "\n" +
'' + "\n" +
str(expiration) + "\n" +
'' + "\n" +
'my-bucket.appspot.com')
signed_string = app_identity.sign_blob(string_to_sign)[1]
signature = base64.b64encode(signed_string)
signature = urllib.quote(signature, safe='')
google_access_id = app_identity.get_service_account_name()
params = '?GoogleAccessId={0}&Expires={1}&Signature={2}'.format(
google_access_id, expiration, signature)
self.template_values['base_url'] = base_url
self.template_values['params'] = params
self.render('testA.html')
、私はGCSにファイルを送信するためにはXMLHttpRequestを使用します。
function gCloud (base_url, params, callback) {
var xhr = new XMLHttpRequest();
var file = document.querySelector('#fotos').files[0]
//Here goes an event listener (callback)
url = base_url + '/' + file.name + params
xhr.open("PUT", url, true);
xhr.setRequestHeader("Content-Type", file.type)
xhr.send(file)
}
問題は、私はこの要求を送信するときに私が得るということです403禁止されたエラー計算された署名が私が提供したものと一致しなかったというエラー。おそらくダムのエラーですが、これを動作させることはできません。何が問題なの?
EDIT:
私はGoogleがクラウドのpythonを使用してみました、と(仕事)は、このコードを試してみました:
def get(self):
bucket = storage.Client().get_bucket(self.get_bucket_name())
blob = bucket.blob('Yosemite.jpg')
expiration = utils.unix_time_secs(datetime.now() + timedelta(hours=1))
base_url = blob.generate_signed_url(expiration, "PUT", 'image/jpeg')
self.template_values['base_url'] = base_url
self.render('testA.html')
問題は今「generate_signed_url」はブロブの方法であることですクラスではすでに、私は、私がしないblob = bucket.blob( 'Yosemite.jpg')のように、URLを作成するオブジェクトの一意のパスを知っていると仮定しています。 Space.jpgをアップロードしたい場合はどうなりますか? my-bucket/Space.jpgを作成する代わりに、Yosemite.jpgが上書きされますので、Yosemite.jpgを開き、イメージを開くと実際はSpace.jpgになります。これをどうすれば解決できますか?
また、 'generate_signed_url'関数にContent-Type = 'image-jpeg'を含めないと、署名が一致しません。ユーザーが代わりにpngをアップロードするとどうなりますか?
あなたの答えをありがとう。私はgoogle_access_idをエスケープしようとしましたが、それで解決できませんでした。私はgoogle-cloud-pythonライブラリを使ってみましたが、それに応じて質問を編集しましたが、その関数がファイル名やコンテンツタイプなどのことを知っていると仮定して、ユーザーにURLを渡す前に理解しています。これについて私は何ができますか? –
OH。クライアント側のURLを編集してオブジェクト名を追加しようとしていますか?それは動作しません。署名されたURLの全体のポイントは、クライアントがリクエストを編集できないようにすることです。ユーザーがオブジェクト名を指定できるようにするには、別のオプションがあります:署名されたPOST要求ポリシー文書。 https://cloud.google.com/storage/docs/xml-api/post-object#policydocument –
このケースではPOSTを使用しますが、他のものにはPUTを保存します。あなたの答えをありがとう! –