2014-01-08 2 views
8

Использование учетных записей Meteor (и accounts-ui) есть ли простой способ сделать приглашение только для новых пользователей? Например, предоставляя ссылку для приглашения или код приглашения.Как сделать только приглашение на регистрацию?

Единственное, что я могу найти в документации Метеор: Meteor.sendEnrollmentEmail, но это не решает мою проблему.

ответ

17

Вы можете сделать это со встроенным пакетом, но я нашел намного проще и мощнее прокрутить простую реализацию.

Вам нужно:

  • Создать коллекцию, например UserInvitations содержать приглашения стать пользователем.
  • Создание пользовательского интерфейса для создания UserInvitations/вставить некоторые с помощью meteor mongo
  • Использование iron-router или аналогичного создания маршрута, например:

    Router.map -> 
        @route 'register', 
        path: '/register/:invitationId' 
        template: 'userRegistration' 
        data: -> 
         return { 
         invitationId: @params.invitationId 
         } 
        onBeforeAction: -> 
         if Meteor.userId()? 
         Router.go('home') 
         return 
    
  • Когда форма в userRegistration представлена ​​- звоните

    Accounts.createUser({invitationId: Template.instance().data.invitationId /*,.. other fields */}) 
    
  • На сервере сделайте крючок Accounts.onCreateUser, чтобы пройти через invitationId от o ptions к пользователю

    Accounts.onCreateUser(function(options, user){ 
        user.invitationId = options.invitationId 
        return user; 
    }); 
    
  • Кроме того, на сервере сделать Accounts.validateNewUser крюк, чтобы проверить invitationId и отметьте приглашение, используемый

    Accounts.validateNewUser(function(user){ 
        check(user.invitationId, String); 
        // validate invitation 
        invitation = UserInvitations.findOne({_id: user.invitationId, used: false}); 
        if (!invitation){ 
        throw new Meteor.Error(403, "Please provide a valid invitation"); 
        } 
        // prevent the token being re-used. 
        UserInvitations.update({_id: user.invitationId, used: false}, {$set: {used: true}}); 
    
        return true 
    }); 
    

Теперь только пользователи, которые имеют действительный неиспользуемый invitationId может зарегистрироваться.

EDIT: Окт 2014 - Обновлен использовать метеор 0.9.x API,

+0

Благодарим вас за описание реализации для этого. Я надеялся, что для этого будет встроенный вариант, но прибегните к его реализации. – Tobold

2

Чтобы сделать это с помощью встроенного в материал, вы можете отвес вместе существующего Accounts.sendEnrollmentEmail - однако, это немного сложнее, чем другие решения данной.

Используя пример кода ниже, вызовите метод enroll как таковой:

Meteor.call('enroll', 'john.smith', '[email protected]', {name: 'John Smith'}); 

Метеор будет затем отправить пользователю ссылку (Вы можете настроить шаблон с Accounts.emailTemplates)

При нажатии на ссылку , meteor вызывает функцию, переданную в Accounts.onEnrollmentLink - в этом случае вы можете перенести их на страницу настройки пароля; но вам нужно возиться со своим обратным вызовом done.

Изменить следующий код, где сказано INSERT XXX HERE; затем в вашем кодовом вызове SomeGlobalEnrollmentObjectThing.cancel(), если пользователь отменяет или SomeGlobalEnrollmentObjectThing.complete(theUsersNewPassword), если они отправят новый пароль.

if (Meteor.isServer){ 
    Meteor.methods({ 
    "enroll": function(username, email, profile){ 
     var userId; 
     check(username, String); 
     check(email, String); // Or email validator 
     check(profile, { 
     name: String 
     }); // your own schema 

     // check that the current user is privileged (using roles package) 
     if (!Roles.isInRole(this.userId, 'admin')){ 
     throw new Meteor.Error(403); 
     } 

     userId = Accounts.createUser({ 
     username: username, 
     email: email, 
     profile: profile 
     }); 

     Accounts.sendEnrollmentEmail(userId); 

    } 
    }); 
} else { 
    // uses `underscore`, `reactive-var` and `tracker` packages 

    function Enrollment(){ 
    this.computation = null; 
    this.token = new ReactiveVar(null); 
    this.password = new ReactiveVar(null); 
    this.cancelled = new ReactiveVar(false); 
    this.done = null; 
    this._bind(); 
    } 

    _.extend(Enrollment.prototype, { 

    _bind: function(){ 
     Accounts.onEnrollmentLink(_.bind(this.action, this)); 
    }, 

    reset: function(){ 
     this.token.set(null); 
     this.password.set(null); 
     this.cancelled.set(false); 
     this.done = null; 
     if (this.computation !== null){ 
     this.computation.stop(); 
     this.computation = null; 
     } 
    }, 

    cancel: function(){ 
     this.cancelled.set(true); 
    }, 

    complete: function(password){ 
     this.password.set(password); 
    }, 

    action: function(token, done){ 
     this.reset(); 
     this.token.set(token); 
     this.done = done; 
     this.computation = Tracker.autorun(_.bind(this._computation, this)); 
     // --- INSERT REDIRECT LOGIC HERE [TAKE TO PASSWORD SETUP PAGE]--- // 
    }, 

    _computation: function(){ 
     var password; 
     if (this.cancelled.get()){ 
     this.reset(); 
     this.done(); 
     // --- INSERT REDIRECT LOGIC HERE [USER CANCELLED]--- // 
     } else { 
     password = this.password.get(); 
     if (password !== null){ 
      Accounts.resetPassword(this.token.get(), password, _.bind(this._complete, this)); 
     } 
     } 
    }, 

    _complete: function(err){ 
     // TODO - check if we were reset before callback completed 
     this.reset(); 
     this.done(); 
     if (err){ 
     // --- INSERT REDIRECT LOGIC HERE [RESET FAILED] --- // 
     } else { 
     // --- INSERT REDIRECT LOGIC HERE [SUCCESS] --- // 
     } 
    } 
    }); 

    SomeGlobalEnrollmentObjectThing = new Enrollment(); 
} 
2

Я создал specific solution to this, так как все другие решения только позволяют явным образом создавать учетные записи на основе пароля.Пакет t3db0t:accounts-invite позволяет создавать учетные записи с любой услугой только тогда, когда вы разрешаете их, например, с помощью маршрута «приглашение». Live demo here.

Смежные вопросы