Angular2でGCSのSignedURLのファイル(Blob)を取得する
- SignedUrlは正しいし、CORSは*。
private fetchUrlAsBlob = (url: string): Observable<Blob> => {
const options = {
responseType: ResponseContentType.Blob,
// headers: new Headers({'Content-Type': 'application/x-www-form-urlencoded'}),
};
return this.http.get(url, options).map((res) => {
return res.blob();
});
}
Content-Typeをつけると403でSignatureDoesNotMatch
というエラーが帰って来て困った
response
<?xml version='1.0' encoding='UTF-8'?><Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.</Message><StringToSign>GET
application/x-www-form-urlencoded
1521814129
/my-bucket/foo%2Fbar%2Fimages%2Fapple.jpg</StringToSign></Error>
StringToSignのタグの中身を見ると、文字列にContent-typeで指定したヘッダー値が含まれている。
署名時に指定したものと異なるので当然シグネチャが違うんでしょうね。
Headerも含めた文字列が署名対象ということかな。
まあ、妥当といえば妥当なきもする。
- エラー解決の決め手になったのはこちら
https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1312
ありがとう