2015-01-23 2 views
5

Firebase 읽기/쓰기 규칙에 다소 방해가됩니다. 인증을 확인하면서 중단 점을 설정하는 방법이 있었으면 좋겠습니다 (방법이 없습니다, 그렇습니까?).특정 사용자 쓰기 액세스 허용

제 질문은 상당히 간단하며 더 잘 이해할 수 있어야합니다. 줄기의 대부분은 규칙을 완전히 이해하지 못하는 것 같아요. 이 정보는 온라인으로 제품을 볼 수있는 간단한 방법이며 제품을 추가 할 수 있어야합니다. 그래서 저는 세계가 읽을 수 있고 로그인하는 사람들이 글을 쓸 수 있기를 바랍니다.

app 
Users 
    email: [email protected] 
product 
    0 
    name: pizza 

그리고 내 규칙 :

{ 
    "rules": { 
     "product":{ 
     ".read": true, 
     ".write":"root.child('Users').child(auth.uid).child('email').val() === '[email protected]'" 
     } 
    } 
} 

와 나는 이것이 무엇을 의미하는지의 큰 이해가없는

내 데이터는 것 같습니다. 나는 정말로 말하고 싶다. 사용자가 로그인했다면 쓰기 기능을 허용한다. 나는 ".write": "auth"과 같은 것을 쓸 수 있었으면 좋겠다. 즉, auth가 존재하면 (사용자가 로그인 한 경우) 그를 써 보자. 그러나 나는 규칙이 어떻게 작동하는지 완전히 이해하지 못하고 있습니다. 간단한 이메일/비밀번호 인증을 사용하고 있습니다.

이 규칙은 어떻게 테스트되며 매개 변수는 어떻게 전달합니까?

답변

13

나는 당신의 .write 보안을 설명하려고합니다

"root.child('Users').child(auth.uid).child('email').val() === '[email protected]'" 

이 실제로 중포 기지 문서가 인정 하듯이 오히려 빨리 깊은 심층적으로하고 시작하는 가장 쉬운 규칙되지 않습니다 :이다 규칙.

내가 트위터 내 응용 프로그램에 로그인 한 후, 내 코드를 알려주는 authData 변수를 얻을 것이다 :

authData 
    uid: "twitter:4511241" 
    provider: "twitter" 
    id: "4511241" 

이있을 수있는 몇 가지 이상의 속성을, 그러나 이것은 그것의 요점해야한다. authData는 일반적으로 제공자에 특정한 속성을 가진 자식 객체를 포함하므로이 경우 twitter이고 일반적으로 꽤 흥미로운 것을 찾을 수 있습니다. 트위터의 경우와 같이, 사용자의 트위터 이름.

authData 
    uid: "twitter:4511241" 
    provider: "twitter" 
    id: "4511241" 
    twitter: 
     userName: "puf" 
     email: "[email protected]" // note: this is just an example email address, 
            // it doesn't exist (as far as I know) 

이 개체는 내 코드에서 사용할 수 있으며 기본적으로 Firebase의 어느 곳에도 저장되지 않습니다.

보안 규칙에서 동일한 구조를 검사 할 수 있습니다. 그러나 사용자를 식별 할 수있을만큼 최소한의 정보 집합 만이 여기에 있습니다. Firebase documentation for the auth object 이름이 등록 정보 :

제공 | 사용 된 인증 방법 ("비밀번호", "익명", "페이스 북", "github", "google"또는 "twitter").

uid | 고유 한 사용자 ID로, 모든 제공 업체에서 고유해야합니다.

이러한 속성을 사용하여 특정 사용자가 Google 데이터에 대한 쓰기 권한을 이미 부여 할 수 있습니다. 나는 당신의 대답에 내 의견에 말했듯이 :

".write": "auth.uid = 'twitter:4511241'" 

이 내 @puf 트위터 계정으로 로그인 할 때 나를 데이터를 기록 할 수 있습니다. 하지만 유감 스럽지만 이메일 주소와 같은 사용자 친화적 인 속성을 확인하지 못합니다.

가장 일반적인 방법은 Firebase에 최상위 노드 인 Users을 만들고 해당 노드 아래에있는 모든 사용자의 정보를 uid로 식별하는 것입니다. 그래서 위의 내 경우 : 사용자의 uid, 당신은 찾아 볼 수 알게되면 그들은 예를

에 대한 많은 가치를 제공하지 않기 때문에

Users 
    twitter:4511241 
     userName: "puf" 
     displayName: "Frank van Puffelen" 
     email: "[email protected]" 
    github:913631 
     userName: "puf" 
     displayName: "Frank van Puffelen" 
     email: "[email protected]" 

나는 여기 공급자 및 ID 오프를 왼쪽 이 노드에있는 그의 추가 정보. 그리고 정확히 무엇인지 보안 규칙 이전에 수행했다 :

"root.child('Users').child(auth.uid).child('email').val() === '[email protected]'" 

그래서이는 로그인 한 사용자의 uid과 그 아래 노드라는 사용자의 경우, 중포 기지의 루트에서 보이는 것 그/그녀의 이메일 주소.

특정 이메일 주소를 확인하는 멋진 점은 사용자의 제공 업체와 관련이 없다는 것입니다. 따라서 사용자가 트위터, github, 페이스 북 또는 기타 지원되는 공급자로 로그온했는지 여부에 관계없이 각 계정에 대해 동일한 이메일 주소를 사용하는 한 데이터를 쓸 수 있습니다.

+0

이 설명은 훌륭했습니다. 위대한 의견을 주셔서 감사합니다. "사용자 -> id -> 전자 메일 : fireuser로"내 사용자 "개체"를 변경한다면 testuser @ test.com' my 원래 상태가 작동합니까? – Aarmora

+0

전자 메일 일치는 멋진 아이디어처럼 보입니다. 보안 위험이 있습니까? 즉, db의/Users 노드는 어떻게 채워지습니까? 클라이언트가 정상 REST 동사를 통해 채워지며 firebase 서비스, 내 프로파일의 삽입을 가로 채는 것을 저지하는 것은 무엇입니까?/Users로 구성하고 내가 좋아하는 이메일 주소를 입력하십시오. [email protected]? joefoo가 당신의 서비스에 대한 계정을 가지고 있다면, 이제 firebase db에서 그의 물건에 접근 할 수있는 것처럼 보입니다. ** EDIT **는 본질적으로 똑같은 PavelGeorgiev의 의견을 보았습니다. – smacke

0

트릭을하는 것 같습니다. auth 변수가 있으면 쓰기 기능을 허용하십시오. 나에게 완전히 이러한 규칙을 이해하지 못하는 인해,이 현재 사용자에 대해 실행하거나 사용자가 로그인되어 있는지 확인 않다면 궁금합니다.

{ 
    "rules": { 
     "product":{ 
     ".read": true, 
     ".write":"auth !== null" 
     } 
    } 
} 
+0

안녕하세요 Aarmora, 이것은 실제로 모든 사람들이 로그인 할 수있는 액세스 권한과 제품 노드를 작성하는 사용자를 허용합니다. 특정 사용자가 쓸 수있는 간단한 예제는''.write ":"auth.uid = "twitter : 4511241"'입니다.이 값은 트위터를 사용하여 인증했을 때 내 앱 중 하나에있는 uid입니다. 그 uid는 가장 쉽게 접근 할 수있는 것이 아니며, 예를 들어 사용자의 전자 메일 주소를'.write' 규칙으로 검색하는 것이 일반적입니다.이 규칙은 질문에있는 예제와 정확히 일치합니다. –

+0

나는 그 규칙을 설명 할 수 있는지에 대한 대답을 참조하십시오. –

관련 문제