2016-07-20 21 views
2

カスタムトークンを使用してfirebaseを認証しています。私は現在のユーザーだけに画像の書き込みと削除を許可し、全員に読み取りアクセスを許可するように制限したい。コードの下Firebaseストレージセキュリティルールエラー - ユーザに許可がありません

ストレージ

let filePath = REF_STORAGE.child("/"+(FIRAuth.auth()?.currentUser?.uid)!+"/profilepic.jpeg") 
let metaData = FIRStorageMetadata() 
metaData.contentType = "image/jpeg" 

に関連する私のSWIFTコードの一部であり、

service firebase.storage { 
    match /b/test-123456789.appspot.com/o { 
    match /{uid}/{allPaths=**} { 
     allow read: if request.auth != null; 
     allow write: if request.auth.uid == uid; 
    } 
    } 
} 

私は画像をアップロードしようとすると、私は次のエラーを取得する以下のように私の現在のfirebaseストレージルールがあります

gs://test-123456789.appspot.com/MYAUTHUID/profilepic.jpeにアクセスする権限がありません。 g。

しかし、私は、ストレージ・ルール以下に保存ルールを変更した場合、私は、画像をアップロードすることができるよとprofilepicが/gs://test-123456789.appspot.com/123456789/profilepic.jpeg

の下に格納されています
service firebase.storage { 
    match /b/test-123456789.appspot.com/o { 
    match /{allPaths=**} { 
     allow read: if request.auth != null; 
     allow write: if request.auth != null; 
    } 
    } 
} 

この問題を解決する方法を教えてください。

+0

あなたの例を簡略化していないことは確かですか?あなたの提供されたルールはhttps://firebase.google.com/docs/storage/security/user-security#full_exampleと基本的に同じであり、そのために必要です。 – Dreamcooled

+0

@Dreamcooled。あなたは私の質問に答えて忘れてしまった – vanquish

+0

@Dreamcooled – Dreamcooled

答えて

1

{uid}には特殊文字が含まれていますか? (例えば「+」記号)

Firebase Supportは、この問題は、私は3日前にそれらを送ったバグレポート以下、調査中であることを私に答えた:私は呼び出し{ユーザID}は私のために動作しませんことを発見しましたFirebase Storage Rulesに '+'記号が含まれている場合

私はE.164形式の電話番号(例:"+97234567899")を使用しています。 私はいくつかの走行テストを試みたが、彼らは明らかに{UID}から返された値に問題があります示した:

  1. request.auth != null;から勤務から
  2. request.auth.uid == "+97234567899";を働い -
  3. request.auth.uid != null;働いたが、
  4. request.auth.uid == uid; -

しかし、私はこの問題を回避する方法を見つけました。 {UID}はフォルダ名を表すので

resource.name.split('/')[position] 

は、あなたがresource.nameを使用して、ファイルの完全なパス文字列を操作して、その値を抽出することができます


ソリューション:これは私が思い付いたものです( '/')で分割し、関連する階層を選択します。例えば

:これはあなたのパスである場合:/Images/Profiles/{uid}/profile.jpg、このようなUIDを抽出します。

service firebase.storage { 
    match /b/test-123456789.appspot.com/o { 
    match /{uid}/{allPaths=**} { 
     allow read: if request.auth != null; 
     allow write: if request.auth.uid == resource.name.split('/')[0]; 
    } 
    } 
} 

編集:あなたのコードサンプルでresource.name.split('/')[2]

を、私はこれを行うだろう(2007年7月28日)

Firebaseサポートは1ヶ月前に自分のレポートに返信しました。問題は現在&が世話を受けていると特定されました。

しかし、その間に電話番号で認証したい場合(私のように)、カスタムトークンを使用しないでください.Firebaseはこのような認証をサポートしています。

+0

お試しいただきありがとうございます – vanquish

1

まだこの問題を抱えている人のために:firebaseセキュリティルールを次のように更新すると、私にとってはやっかいです。

service firebase.storage { 
    match /b/{bucket}/o { 
    match /{allPaths=**} { 
     allow read, write: if request.auth.uid != null; 
    } 
    } 
} 
関連する問題