2

AngularJS와 Firebase를 가르치고 있으며 두 개의 사용자 역할 A와 B가있는 앱을 개발 중입니다. 역할 B는 유효한 초대 코드가있는 경우에만 사이트에 등록 할 수 있습니다.Firebase에 등록하기위한 초대 코드 관리

Firebase를 백엔드로 사용하고 AngularFire 바인딩을 사용하고 있습니다. 나는 Yeoman 발전기 발전기 - 각도 파이어로 프로젝트를 시작했습니다. 후자는 Firebase 기본 암호/단순 로그인 인증 방법을 제공합니다.

내 등록 양식에는 전자 메일/암호 이외의 필드가 더 있습니다. 사용자 ID, 전자 메일, 패스는 Firebase에 의해 내부적으로 처리되고 성공적으로 저장됩니다. 또한, 나는 "계정"라는 또 다른 중포 기지 문서에 성공적으로 등록시 그 다른 필드를 저장합니다

"accounts": { 
    "simplelogin:16" : { 
     "company" : "foo corp", 
     "firstName" : "lorem", 
     "lastName" : "ipsum", 
     "type" : "userRoleA" 
    }, 
    "simplelogin:19" : { 
     "company" : "bar corp", 
     "firstName" : "dolor", 
     "lastName" : "sit", 
     "type" : "userRoleA" 
    }, 
    "simplelogin:17" : { 
     "city" : "new york", 
     "firstName" : "asd", 
     "lastName" : "asd", 
     "type" : "userRoleB" 
    }, 
    "simplelogin:18" : { 
     "city" : "washington", 
     "firstName" : "a", 
     "lastName" : "a", 
     "type" : "userRoleB" 
    } 
} 

을 지금은 코드를 초대 기능을 구현하는 안전한 방법을 찾기 위해 노력하고있다. 때문에 사용자 A가이 코드를 생성 할 수 있도록하려면 다음 단계에서, 단순히 직접 중포 기지에 넣어 수 없습니다 - 코드를 초대 생성

"inviteCodes" : { 
    "111" : { 
    "generator" : "system" 
    }, 
    "222" : { 
    "generator" : "system" 
    }, 
    "333" : { 
    "generator" : "system" 
    } 
} 

1 : 나는 "inviteCodes"라는 중포 기지 문서를 추가 한 . 하지만 프론트 엔드에 메소드를 공개하지 않고 Firebase에서 코드를 생성하려면 어떻게해야합니까? "InviteCodes"문서에 대한 "accounts"문서 쓰기 권한 내에 "userRoleA"유형의 인증 된 사용자에게만 부여하는 Firebase 규칙을 추가하여이 문제를 해결할 수 있습니다. 이것은 갈 길입니까 아니면 다른 길입니까? 이 경우 코드를 생성하는 메소드가 여전히 노출되어 있기 때문입니다.

2 - 1)이 해결되고 초대 코드가 Firebase 문서에 있다고 가정합니다. 등록시 $ createUser 메소드를 호출하기 전에 제공된 초대 코드가 유효한지 확인해야합니다. Firebase를 쿼리하고 제공된 코드가 저장된 초대 코드와 일치하는지 확인합니다. 다음과 같은 (더미 코드) 그림 :

var firebaseCodes = firebaseRefInviteCodes; 
var providedCode = registrationForm.providedCode; 
var isCodeValid = false; 

for (var i = 0; i < firebaseCodes.length; i++) { 
    if (firebaseCodes[i] === providedCode) { 
    isCodeValid = true; 
    } 
} 

그러나이 쿼리에서 모든 코드는 프론트 엔드에 노출됩니다. 제공된 코드가 모든 코드를 노출시키지 않고 유효한지 확인하는 방법이 있습니까?

입력 해 주셔서 감사합니다.

답변

4

초대장을 생성하기 위해 보안 무작위 토큰 생성기가 될 때까지 프론트 엔드에서 문제가 발생하지 않습니다. 파일을 생성하기 위해 Firebase를 가질 수도 있습니다 :

var inviteCode = firebaseRef.push().key(); 

보안 규칙은 Firebase에서 응용 프로그램 데이터를 보호하는 강력한 방법입니다. 그러나 올바르게 작동하게하려면 올바른 방식으로 데이터 구조를 설계해야합니다. 이 경우 '관계형'DB 접근 방식이 작동하지 않습니다. 문제는 userA가 userB와 함께 만 초대를 공유하고 있고 다른 사람이 그 (것)들을 볼 수 있어야한다는 것입니다. 모든 액세스 코드를 하나의 '테이블'에 저장하는 것은 좋은 방법이 아닙니다. 나는 userA가 초대를 만들 때이 초대가 어떤 사용자인지를 알고 있다고 가정합니다. 또한 사용자의 이메일을 저장할 수있는 코드를 생성

/inviteCodes/invitee - public, so userA can insert new invite code for userB 

/inviteCodes/invitee/{userB_email} - write new data - public, read - private, can be accessed only by userB, e.g. data.exists() && newData.child('email').val() === $userB_email && newData.child('inviteCode').val() === data.child('code').val() 

사용자 A를이 경우이와 유사한 데이터 구조를 설계 할 수 있습니다 다음과 같이이 구성에

-inviteCodes 
    -invitee 
     -{$userB_email} 
      -code: {codeValue} 
      -inviterId: {userAId} 
      -generator: "system" 

을, 보안 규칙이 될 수 있습니다 코드가 생성 된 다음 전자 메일 및 해당 inviterId를 사용하여이 데이터에 액세스 할 수도 있습니다.

이렇게하면 다른 사용자의 초대를 검색 할 필요가 없습니다.

+1

많은 의견을 보내 주셔서 감사합니다. 그러나 나는 후속 질문을 가지고있다 : 사용자 A가 코드를 생성하고 그것을 종이 한 장에 사용자 B에게주고 싶다고하자. 나는 사용자 B가 모든 이메일 주소 (코드를 보내는 데 사용 된 한 명의 사용자 만이 아님)에 등록 할 수 있기를 원합니다. 제공된 코드로 파이어베이스를 쿼리하고이 값과 정확하게 일치하는 데이터 세트 만 리턴 할 수있는 방법이 있습니까? 있어야하지만 문서에서 찾을 수 없습니다. 동시에 누군가가 전체 "inviteCodes"문서를 질의하지 못하게하는 보안 규칙이 필요합니다. – maze

+0

나는 또한 동일한 문제 (사용자가 초대 코드를받은 후 이메일을 사용할 수 있음)를 해결하기 위해 노력하고 있지만 Firebase가이를 수행 할 수 있다고 생각하지 않습니다. 그들이 코드를 추측하면 초대하십시오. –

+0

@ MurraySmith 글쎄, 그 코드는 반드시 무작위이고 추측 할 수 없어야합니다. –