2016-07-11 18 views
1

hallo in meinem Speicher Regeln i diesen Code habenFeuerbasis Speicherprüfung Metadaten im Schreibmodus Fehler

match /Image/{user}/{image}/image.jpg { 
     allow write: if request.auth != null && (request.auth.uid == user || request.auth.uid == 'nodeserver') && (resource.metadata['private'] == true || resource.metadata['private'] == false) 
     allow read: if request.auth != null && (request.auth.uid == user || resource.metadata.private == false) 
    } 

wenn ich versuche, wie dieses i

var imageRef = storageRef.child('Image/' + uid + '/' + imageId + '/image.jpg'); 

      var metadata = { 
       customMetadata: { 
        private: false 
       } 
      }; 

      var imgref = imageRef.put(image, metadata); 

eine benutzerdefinierte Metadaten, die von Client-Seite zu schreiben, erhalten diese Fehler von Feuerbasis Server

POST https://firebasestorage.googleapis.com/v0/b/project-4815133492804887736.app…Image%2F39IhnMU70uYrhJ9Y0XWBEMtQDR63%2F-KMP9NDx3D2gjJix3bpL%2Fimage.jpg 403() 
service.js:303 x {code: "storage/unauthorized", message: "Firebase Storage: User does not have permission to…hJ9Y0XWBEMtQDR63/-KMP9NDx3D2gjJix3bpL/image.jpg'.", serverResponse: "{↵ "error": {↵ "code": 403,↵ "message": "Pe…n denied. Could not perform this operation"↵ }↵}", name: "FirebaseError"}code: "storage/unauthorized"message: "Firebase Storage: User does not have permission to access 'Image/39IhnMU70uYrhJ9Y0XWBEMtQDR63/-KMP9NDx3D2gjJix3bpL/image.jpg'."name: "FirebaseError"serverResponse: "{↵ "error": {↵ "code": 403,↵ "message": "Permission denied. Could not perform this operation"↵ }↵}"__proto__: Error__proto__: Object 

, wenn ich diesen Code von Regeln entfernen

(resource.metadata['private'] == true || resource.metadata['private'] == false) 

alle funktionieren gut, aber ich möchte die Metadaten überprüfen. Was ist die Lösung?

Antwort

1

Sie möchten request.resource anstelle von resource verwenden. Dies liegt daran, dass resource sich auf das bezieht, was derzeit existiert (die Datei ist bereits gespeichert), während request.resource sich auf die Ressource auf der Anfrage bezieht (die hochgeladene Datei).

match /Image/{user}/{image}/image.jpg { 
    allow write: if request.auth != null && (request.auth.uid == user || request.auth.uid == 'nodeserver') && (request.resource.metadata['private'] == true || request.resource.metadata['private'] == false) 
    allow read: if request.auth != null && (request.auth.uid == user || resource.metadata.private == false) 
} 

Beachten Sie, dass die read Regel resource verwenden sollte, da es auf die Datei sich bezieht, die bereits vorhanden ist, während die write Regel request.resource nachschlagen muss, denn das ist, was hochgeladen hat wird.

+0

Ich versuche mit request.resource und ich bekomme den gleichen Fehler – DThink

+0

Updates zu diesem Thema? – DThink

1

einfach aktualisieren Sie Ihre Speicher Regeln dazu:

service firebase.storage { 
    match /b/barcodemanager-8dd41.appspot.com/o { 
    match /{allPaths=**} { 
     allow read, write;//: if request.auth != null; 
    } 
    } 
} 

In meinem Fall gelöst es mein Problem!