web-dev-qa-db-ja.com

FirebaseStorageから画像を読み込もうとすると403Forbiddenエラーが発生する

Firebaseストレージを使用して、ユーザーの画像をAndroidアプリに保存および読み込む。使用する前に、すべてのユーザーを認証する必要があります。一部のユーザープロフィール画像が表示されず、「403Forbidden」がスローされることがあります。 「エラー。これらの画像は以前に表示されていましたが、なぜ機能しなくなるのかわかりません。Firebaseストレージで次のルールを使用しています。

 service firebase.storage {
   match /b/<storage_address>.appspot.com/o {
    match /{allPaths=**} {
     allow read: if request.auth != null;
     allow write: if request.auth != null;
    }
  }
}

読み取りルールをallow read;に変更すると、すべての画像が正しく機能します。これは私の表示方法です:

Picasso.Builder builder = new Picasso.Builder(this);
                builder.listener(new Picasso.Listener()
                {
                    @Override
                    public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception)
                    {
                        exception.printStackTrace();
                    }
                });
                builder.build().load(URL).into(imgView);

画像のURLは次のようになります。

https://firebasestorage.googleapis.com/v0/b/<storage_address>.appspot.com/o/images%2Fprofile%2Fphoto%2F36805?alt=media&token=e62ec151-3aaf-4e5c-aefb-1b3c93828684

それはトークンと関係があるのでしょうか?

7
bbenis

おそらく手遅れになりますが、他の誰かに役立つかもしれません。同じ問題が発生しました。問題は、Firebaseストレージ内のファイル名が一意であるということです。同じファイル名で新しいファイルをアップロードすると、古いファイルが上書きされて新しいトークンが生成され、古いURLが廃止されます。アップロードしたファイルに一意のファイル名を生成してから、修正する必要があります。

19
user2555964

ストレージをテストしているだけの場合は、認証を実装していない可能性があります。デフォルトでは、ストレージはアップロードするユーザーが認証されることを想定しています。これをバイパスするには、[ストレージ]-> [ルール]に次のように記述します。

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth == null;
    }
  }
}

私にとって魅力のように働いた。 Firebaseを楽しんでください

7
Arizona2014

ファイルの拡張子が正しくないか欠落している場合、次のエラーが発生します。

 {
    "error": {
    "code": 403,
    "message": "Permission denied. Could not perform this operation"
    }
 }

指定した画像のURLでは、画像名の後に画像の拡張子はありません。

私は自分のURLの1つでテストしました、これは機能します(テストできます): https://firebasestorage.googleapis.com/v0/b/training-a0a3e.appspot.com/o/penguin-56101_640.jpg ?alt = media&token = 8dfb913d-e2f3-4956-bd3a-2c3746d0d6d

ただし、.jpgが削除された場合: https://firebasestorage.googleapis.com/v0/b/training-a0a3e.appspot.com/o/penguin-56101_640?alt=media&token=8dfb913d-e2f3-4956- bd3a-2c3746d0d6d

次の応答が受信されます。

 {
    "error": {
    "code": 403,
    "message": "Permission denied. Could not perform this operation"
    }
 }
5
Chris Herbst

私はあなたと同じ問題を抱えていました。これは遅い答えですが、多分これは誰かを助けることができます。

私にとっての問題は、 ser2555964 で説明したとおりでした。

URLのみを指定し、トークンを参照していることがわかります。 this のようなストレージパスからURLをダウンロードせず、データベースに参照を保持するだけだと思います。

私の詳細な問題は、画像をアップロードするときにURLを保存してデータベースに保存し、Firebaseクラウド機能(元の画像のコピー、最適化、置換)で画像を最適化するストレージトリガーがあり、トークンが変更されたことです。画像、ストレージルールの認証をチェックするときにURLのトークンを無価値にします。

私にとっての解決策は、代わりにストレージパスを保存し、正しいトークンを使用して現在のURLをダウンロードすることでした。

0
Marcus C