Firebase 存储规则未经授权

KLT*_*LTR 5 firebase angularfire firebase-authentication firebase-storage angular

firebase存储规则

\n\n

我正在尝试上传文件,除非我使用允许读取、写入,否则我将未经授权。

\n\n
FirebaseStorageError {code_: "storage/unauthorized", message_: "Firebase \nStorage: User does not have permission to\xe2\x80\xa62/dxbdIGnx2Qdm9MfTtG5e/if_spider-\nweb_345348.png\'.", serverResponse_: "{\xe2\x86\xb5  "error": {\xe2\x86\xb5    "code": 403,\xe2\x86\xb5    \n"message": "Pe\xe2\x80\xa6n denied. Could not perform this operation"\xe2\x86\xb5  }\xe2\x86\xb5}", name_: \n"FirebaseError"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想知道 firebase 如何知道用户已登录?在我的代码中,我在尝试上传文件时不发送任何身份验证。

\n\n

这是我上传文件的代码:

\n\n
let uploadTask = storageRef.child(`user_content`).child(uid).child(upload.podcast_id).child(upload.file.name).put(upload.file);\n  uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED,\n    (snapshot) =>{\n      // upload in progress\n      upload.progress = Math.floor((uploadTask.snapshot.bytesTransferred / uploadTask.snapshot.totalBytes )* 100)\n    },\n    (error) =>{\n      // upload failed\n      this.flashMessagesService.show(\'Oh snap! please try again..\',  { cssClass: \'alert alert-danger\', timeout: 1500 })      \n      console.log(error)\n    },\n    () => {\n      // upload success\n      upload.url = uploadTask.snapshot.downloadURL;\n          //  upload.name is the name ref in firebase storage\n      upload.name = uploadTask.snapshot.ref.name;\n      upload.ref = uploadTask.snapshot.ref.fullPath;\n      this.flashMessagesService.show(\'File was successfuly uploaded!\',  { cssClass: \'alert alert-success\', timeout: 1500 })\n\n    }\n  )\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有一个身份验证服务,要求用户登录才能访问此上传页面:

\n\n
import { Injectable } from \'@angular/core\';\nimport { Router } from \'@angular/router\';\nimport {FlashMessagesService} from \'angular2-flash-messages\';\n\nimport * as firebase from\'firebase/app\';\nimport { AngularFireAuth } from \'angularfire2/auth\';\nimport { AngularFirestore, AngularFirestoreCollection, AngularFirestoreDocument } from \'angularfire2/firestore\';\nimport  {Observable } from \'rxjs/Observable\';\nimport \'rxjs/add/operator/switchMap\'\nimport { User } from \'../models/user\'\n@Injectable()\nexport class AuthService {\nuser: Observable<User>;\ncurrentUser: firebase.User;\n  constructor(\n    private afAuth: AngularFireAuth,\n    private afs: AngularFirestore,\n    private router: Router,\n    public flashMessagesService: FlashMessagesService,\n  ) { \n      // Get auth data, then get firestore user document // null\n      this.user = this.afAuth.authState\n      .switchMap(user => {\n        if(user){\n          return this.afs.doc<User>(`users/${user.uid}`).valueChanges();\n        } else {\n          return Observable.of(null)\n        } \n      })\n }\n\ngetCurrentUser(){\n  return this.afAuth.auth.currentUser;\n}\n\ngetAuthState(){\nlet currentUser = this.afAuth.auth.currentUser;\n\n  if(currentUser){\n    return true;\n  }else{\n    return false;\n  }\n\n}\n\n googleLogin() {\n  const provider = new firebase.auth.GoogleAuthProvider();\n   return this.oAuthLogin(provider);\n  }\nfacebookLogin(){\n  const provider = new firebase.auth.FacebookAuthProvider();\n  return this.oAuthLogin(provider);\n}\nanonymousLogin(){\n  const provider = new firebase.auth.EmailAuthProvider();\n  return this.oAuthLogin(provider);\n}\n\n  private oAuthLogin(provider){\n    return this.afAuth.auth.signInWithPopup(provider)\n    .then((credential)=> {\n      this.updateUserData(credential)\n      this.router.navigate([\'/home\'])\n    })\n  }\n\n  private updateUserData(credential){\n    const userRef: AngularFirestoreDocument<User> = this.afs.doc(`users/${credential.user.uid}`);\n    const data: User = {\n      uid: credential.user.uid,\n      email: credential.user.email,\n      displayName: credential.user.displayName,\n      photoURL: credential.user.photoURL,\n      accessToken: credential.credential.accessToken,\n    } \n    if(!data.gender){\n      data.gender = \'Unassigned\'\n    }\n    this.flashMessagesService.show(\'You are now logged in \', { cssClass: \'alert alert-success\', timeout: 3000 })\n\n    return userRef.set(data)\n  }\n  signOut() {\n    this.afAuth.auth.signOut().then(() => {\n      this.flashMessagesService.show(\'You are now logged out \', { cssClass: \'alert alert-success\', timeout: 3000 })\n\n        this.router.navigate([\'/\']);\n    });\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在这个例子中使用谷歌登录。我仍然不清楚 firebase 如何知道用户已登录,因为我在上传文件时没有发送任何授权。如果你能对这个问题有所了解,那就太好了,因为我已经在这件事上崩溃了三天了。

\n