2016-07-20 5 views
2

맞춤 토큰을 사용하여 firebase에 인증하고 있습니다. 현재 사용자에게만 이미지 쓰기 및 삭제 권한을 부여하고 모든 사용자에게 읽기 액세스 권한을 부여하고 싶습니다. 코드 아래Firebase 저장소 보안 규칙 오류 - 사용자에게 허가가 없습니다

내가 다음과 같은 오류가 이미지를 업로드 할 때

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; 
    } 
    } 
} 

아래와 같습니다 저장

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

그리고 내 현재 중포 기지 저장 규칙에 관한 내 빠른 코드의 일부입니다

사용자에게 gt : //test-123456789.appspot.com/MYAUTHUID/profilepic.jpe에 대한 액세스 권한이 없습니다. 지. 내가 저장 규칙 아래에 저장 규칙을 변경하는 경우

는하지만, 나는 이미지를 업로드 할 수 있어요와 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

답변

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 추출 : 코드 샘플에서 resource.name.split('/')[2]

를, 내가 이런 짓을 했을까 :

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]; 
    } 
    } 
} 

편집 (2017 년 7 월 28 일)

Firebase Support에서 한 달 전에 내 보고서에 응답했으며 문제가 지금 &을 알아 냈습니다.

그러나 그동안 전화 번호로 인증을 받으려는 경우 Firebase가 이제 이러한 인증을 지원하므로 사용자 지정 토큰을 더 이상 사용하지 않아야합니다.

+0

시험해 주셔서 감사합니다. – vanquish

1

여전히이 문제가있는 사람 : firebase 보안 규칙을 다음과 같이 업데이트하면 트릭이 나에게 유용합니다.

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