web-dev-qa-db-ja.com

Google Cloud関数のgetSignedURL()は、数日間機能するリンクを生成してから、 "SignatureDoesNotMatch"を返します。

私のFireBase Storage getSignedUrl()リンクをダウンロードすると、数日間作業してから作業を中止してください。エラーメッセージはです

_SignatureDoesNotMatch
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
_

去年の夏は長い ディスカッション githubでこれの==がありましたが、解決策に達したことがわかりません。

バックエンドからgetDownloadURL()を使用するのではなく、フロントエンドからgetSignedUrl()を使用することを考えています。 getDownloadURL()はセキュリティが少なくgetSignedUrl()

これが私のコードです。これは主に ドキュメント

_let audioType = 'mp3';
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const bucket = storage.bucket('my-app.appspot.com');
var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + wordFileType);

  // Firebase Storage file options
  var options = {
    metadata: {
      contentType: 'audio/' + audioType,
      metadata: {
        audioType: audioType,
        longAccent: 'United_States',
        shortAccent: 'US',
        longLanguage: 'English',
        shortLanguage: 'en',
        source: 'Oxford Dictionaries',
        Word: Word
      }
    }
  };

  const config = {
    action: 'read',
    expires: '03-17-2025',
    content_type: 'audio/mp3'
  };

  function oedPromise() {
    return new Promise(function(resolve, reject) {
      http.get(oedAudioURL, function(response) {
        response.pipe(file.createWriteStream(options))
        .on('error', function(error) {
          console.error(error);
          reject(error);
        })
        .on('finish', function() {
          file.getSignedUrl(config, function(err, url) {
            if (err) {
              console.error(err);
              return;
            } else {
              resolve(url)
            }
          });
        });
      });
    });
  }
_
5

短縮されたURLは、expiresフィールドを指定した日付に有効期限が切れます。

しかし、ここで見ている問題は、管理SDKのKMSキーが7日ごとに回転することです。そのため、自動プロビジョニングされたStorage()ライブラリを使用してPRESIGNEDURLを作成した場合、鍵が払い戻しされたURLを回転させると(署名に使用される鍵は無効になっていないため)。そのため、鍵の年齢に応じて、URLは7日以下で有効になります。

代わりに、管理SDKを使用しないでください。代わりに Google Cloud Storage NPMモジュール を使用して、サービスアカウントJSONで初期化します。

const storage = new Storage({keyFilename: "key.json"});

また

`const storage = new storage({信任状:require(" key.json ")});

1
David D.

私はこの質問に長い答えを書いた: Firebaseのためのクラウド機能でアップロードされたファイルからURLをダウンロードする 。この質問は重複としてマークできます。



  [1]: https://stackoverflow.com/questions/42956250/get-download-url-from-file-uploaded-with-cloud-functions-for-firebase
 _
0