나는 당신의 .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, 페이스 북 또는 기타 지원되는 공급자로 로그온했는지 여부에 관계없이 각 계정에 대해 동일한 이메일 주소를 사용하는 한 데이터를 쓸 수 있습니다.
이 설명은 훌륭했습니다. 위대한 의견을 주셔서 감사합니다. "사용자 -> id -> 전자 메일 : fireuser로"내 사용자 "개체"를 변경한다면 testuser @ test.com' my 원래 상태가 작동합니까? – Aarmora
전자 메일 일치는 멋진 아이디어처럼 보입니다. 보안 위험이 있습니까? 즉, db의/Users 노드는 어떻게 채워지습니까? 클라이언트가 정상 REST 동사를 통해 채워지며 firebase 서비스, 내 프로파일의 삽입을 가로 채는 것을 저지하는 것은 무엇입니까?/Users로 구성하고 내가 좋아하는 이메일 주소를 입력하십시오. [email protected]? joefoo가 당신의 서비스에 대한 계정을 가지고 있다면, 이제 firebase db에서 그의 물건에 접근 할 수있는 것처럼 보입니다. ** EDIT **는 본질적으로 똑같은 PavelGeorgiev의 의견을 보았습니다. – smacke