2014-02-13 5 views
0

공개 등록을 지원하지 않는 응용 프로그램을 만들고 있습니다. 기존 사용자가 새 사용자를 만들고 새 사용자의 이메일 주소로 등록 이메일을 보냅니다. 이 모든 것이 작동하지만, 구현은 해킹 된 것으로 느껴집니다.암호없이 사용자를 생성 할 때 성공/실패를 클라이언트에게 어떻게 알릴 수 있습니까?

여기까지 코드가 있습니다.

<template name="addUser"> 
    <form role="form"> 
     <div class="form-group"> 
      <label for="firstName">First Name</label> 
      <input name="firstName" class="form-control" placeholder="First Name" /> 
     </div> 
     <div class="form-group"> 
      <label for="lastName">Last Name</label> 
      <input name="lastName" class="form-control" placeholder="Last Name" /> 
     </div> 
     <div class="form-group"> 
      <label for="email">Email</label> 
      <input name="email" class="form-control" placeholder="Email" /> 
     </div> 

     <button type="submit" class="btn btn-primary">{{faIcon 'plus'}} Add User</button> 
    </form> 
</template> 

템플릿의 자바 스크립트 : 템플릿

Accounts.createUser 이후

Meteor.methods({ 
    addUser: function (attrs) { 
     var user = Meteor.user(); 

     if (!user) throw new Meteor.Error(401, 'Please login.'); 
     if (!attrs.profile.firstName) throw new Meteor.Error(422, 'Please include a first name.'); 
     if (!attrs.profile.lastName) throw new Meteor.Error(422, 'Please include a first name.'); 
     if (!attrs.email) throw new Meteor.Error(422, 'Please include an email.'); 

     var user = _.pick(attrs, ['firstName', 'lastName', 'email']); 

     if (Meteor.isServer) { 
      var newUserId = Accounts.createUser(attrs); 
      Accounts.sendEnrollmentEmail(newUserId); 
     } 
    } 
}); 

가 클라이언트 측에 암호를 입력해야합니다

Template.addUser.events({ 
    'submit form': function (e, t) { 
     e.preventDefault(); 

     var attrs = { 
      email: t.find('[name="email"]').value, 
      profile: { 
       firstName: t.find('[name="firstName"]').value, 
       lastName: t.find('[name="lastName"]').value, 
      } 
     }; 

     Meteor.call('addUser', attrs, function (err) { 
      if (err) { 
       Errors.throw(err.reason); 
      } else { 
       Router.go('home'); 
      } 
     }); 
    } 
}); 

addUser 방법, 나는 방법을 알아낼 수 없습니다 성공 또는 실패를 클라이언트에게 0으로 해킹하는 것을 알리지 않음. 그런 일을하는 좋은 방법은 무엇입니까?

+0

정확히 어떤 정보를 사용자에게 보내려고합니까? 주위에 '오류'가 발생하는 것을 볼 수 있습니다. 충분하지 않아? 왜, 서버에 전체 메서드를 넣으십시오? 또한,'Meteor.call'의 마지막 인수는 메소드 실행이 성공했는지 탐지하는 데 사용할 수있는 콜백이 될 수 있습니다. –

+0

'Accounts.createUser' 또는'Accounts.sendEnrollmentEmail' 호출이 실패하면 사용자에게 알리고 싶습니다. 나는 일반적으로 콜백에서 오류 매개 변수를 찾겠지 만, Accounts.createUser는 콜백을 서버에 전달하면 예외를 던집니다. "오류 : Accounts.createUser 콜백이 아직 서버에서 지원되지 않습니다." 질문을 게시 한 이후로 가장 좋은 점은'if (! newUserId) { \t \t \t throw new Meteor.Error (500, '서버에서 사용자를 생성하는 동안 오류가 발생했습니다. 다시 시도하십시오. '); \t \t} –

답변

2

첫째, (server 디렉토리에서 예) 전용 서버에 addUser 방법을 넣어 :

: 클라이언트에서,

Meteor.methods({ 
    addUser: function (attrs) { 
    var user = Meteor.user(); 

    if (!user) // you can also check this.userId here 
     throw new Meteor.Error(401, 'Please login.'); 

    if (!attrs.profile.firstName) 
     throw new Meteor.Error(422, 'Please include a first name.'); 

    if (!attrs.profile.lastName) 
     throw new Meteor.Error(422, 'Please include a first name.'); 

    if (!attrs.email) 
     throw new Meteor.Error(422, 'Please include an email.'); 

    var user = _.pick(attrs, ['firstName', 'lastName', 'email']); 

    var newUserId = Accounts.createUser(attrs); 
    Accounts.sendEnrollmentEmail(newUserId); 
    } 
}); 

그런 다음과 같은 작업을 수행 할 수 있습니다

+0

감사합니다. 이후 서버 폴더에 넣었고'Meteor.call' 콜백 오류를 처리 할 코드를 이미 가지고있었습니다. 나는 Accounts의 소스를 파헤 쳤고'createUser'는 실패 할 경우'새로운 Meteor.Error를 던져 버리는 것 같다. 던져 질 경우 그 오류가 'Meteor.call' 콜백으로 전송 될 것이라고 가정하는 것이 안전한가요? 슬프게도,'sendEnrollmentEmail'은''새로운 에러를 던집니다. –

+0

콜백의 'err' 인수가 정확히 설계된 것 같습니다. :) –

-3

사용자에게 기본 암호를 제공하십시오.

(나는 당신의 addUser 방법 내부 check() 기능을 사용하는 것이 좋습니다 -. 당신의 if 문장의 일부를 교체 또한, 당신만큼 당신이 /server 폴더 안에있는 JS 파일을 넣어 Meteor.isServer 필요하지 않습니다.)

+0

보안상의 이유로 기본 암호가 필요하지 않습니다. –

+0

물론 글로벌 암호는 안전하지 않지만 나중에 사용자가 쉽게 변경할 수있는 안전한 개별 암호를 쉽게 생성 할 수 있습니다. (추신 : 동의하지 않기 때문에 투표를하지 말아주세요 - 아래로 투표하는 것은 오도 된 질문이나 관련없는 답변입니다.) – dalgard

+0

나는 당신이 저에게 일을했기 때문에 답을 썼습니다. 내가 묻는 질문에 대한 해결책 대신에 주위에. –