2016-12-10 7 views
0

s3にビデオをアップロードし、事前に署名されたPUT URLを取得しようとしています。これを行うためのコードは次のとおりです。SignatureDoesNotMatchエラーがIonic 2を使用して事前に署名されたURLを使用してアップロードされました

import {Component} from '@angular/core'; 
import {NavController} from 'ionic-angular'; 
import {MediaCapture} from 'ionic-native'; 
import {Http} from '@angular/http'; 
import { Transfer } from 'ionic-native'; 

@Component({ 
    selector: 'page-home', 
    templateUrl: 'home.html' 
}) 

export class HomePage { 

    public base64Image: string; 

    constructor(private navController: NavController, public http: Http) { 
     this.base64Image = "https://placehold.it/150x150"; 
    } 

    public takeVideo() { 
     MediaCapture.captureVideo({limit:2}).then(function(videoData){ 
      var link = "https://mysamplebucket.s3.amazonaws.com/non-tp/esx.mov?AWSAccessKeyId=TEMP_KEYY&Expires=1482290587&Signature=JUIHHI%2FcnLkqSVg%3D&x-amz-security-token=FQoDYXDGRfTXk6hma0Rxew6yraAX%2FlYGaQmYLwkvsuuB3%2F%2FtPvGDVs3dIQG0Ty3MeMjn0p%%26djt5xhAMk73pndJbZP0tCYYlvPvlUAyL8x7O%%2B3AwEa%%2B9b43yarIuPLCvujmKLTDyi%%3D%3Di"; 

      var options: any; 

      options = { 
      fileKey: 'file', 
      fileName: 'esx.mov', 
      httpMethod: 'PUT', 
      chunkedMode: false, 
      mimeType: 'video/quicktime', 
      encodeURI: false, 
      headers: { 
       'Content-Type': 'video/quicktime' 
       } 
      }; 

      var ft = new Transfer(); 
      ft.upload(videoData[0].fullPath, link, options, false) 
       .then((result: any) => { 
        this.success(result); 
       }).catch((error: any) => { 
        this.failed(error); 
       }); 

     }, function(err){ 
      alert(err); 
     }); 
    } 


} 

ここには、事前に署名されたPUT URLを生成するコードがあります。

var params = {Bucket: s3_bucket, Key: filename, Expires: 900000}; 
var url = { 
    'url' : s3.getSignedUrl('putObject', params) 
}; 

私は、SignatureDoesNotMatchエラーが発生します。メッセージには、The request signature we calculated does not match the signature you provided. Check your key and signing method.と書かれています。私がここで間違っていることがわかりません - 私はいくつかの他のSOとIonicの質問を見て、何も役に立たないように勧めました。私が何をして間違っているかについてのアイデアは?

+0

あなたは事前に署名したPUTのURLを「持っている」と言うが、あなたはしていないようですそれを生成するために使用しているコードを表示します。問題がどこにあるのかは確かです。このコードと、具体的には正規のリクエストを生成するために使用しているパラメータを表示しますか? (秘密鍵ではない、もちろん)。 content-typeは、含める必要のあるパラメータの1つです。 –

+0

@ Michael-sqlbot私はそれを生成するサーバー側のコードを持っています。私はそれを得るために呼び出すAPIの終点があります。今、私はこのコードをテストしているので、Postmanを使ってapiエンドポイントを呼び出し、単に '' link''変数に入れてください。 – blehadfas1

+1

これは問題の原因と思われます。署名コードが正しく動作すると仮定すると、問題はリンクを取得するために渡すパラメータにあるようです。これを診断するためには、より多くの情報が必要です。 –

答えて

2

お客様のアップロードPUTリクエストにはContent-Type: video/quicktimeヘッダーがあります。

レスポンスではなくリクエストにContent-Typeヘッダーがある場合、その値はSignature V2標準要求の非オプションコンポーネントです。つまり、署名を生成するコードに渡す必要があります。

var params = {Bucket: s3_bucket, Key: filename, Expires: 900000};も(この場合には、video/quicktime)この文字列を必要と

PUT要求に対して ContentType: ...として渡された(しかし、これはあなたがを送信 されたコンテンツ、およびGET要求を記述するのでないGET要求のために、通例無送ります実際のコンテンツ。

SDK documentationはこれを具体的に言及していないようだが、それが最も確実S3によって必要とされる。

+0

あなたが言っていることは理にかなっていますが、ここで私は混乱しています。私はSwiftで書かれたアプリケーションのバージョンを持っています。ここでは、上記のコードから取得したURLにContent-Typeを指定せずにAlmaofireでPUTリクエストを行い、正常に動作します。また、私はURLを生成するときにContent-Typeを指定しないので、Content-TypeをPUTリクエストから削除するのがなぜ機能しないのですか? – blehadfas1

+0

PUT URLを生成したコードに「ContentType:video/quicktime」を追加すると、問題が解決しました。 – blehadfas1

+1

*「PUT要求からContent-Typeを削除するのはなぜですか?」*指定しないと、それをユーザーエージェントが追加することができない可能性があります。 'mimeType: 'video/quicktime'' *おそらく' Content-Type'の設定は、おそらく同義語であるか、ユーザエージェントがデフォルトの 'application/octet-stream'または「アプリケーション/バイナリ」。確かに知るには、実際のHTTPトランザクションを観察する必要があります。 –

関連する問題