Статьи

Создание пользовательской формы входа в систему и регистрации с Meteor

Прямо из коробки одна из самых простых вещей, которую вы можете сделать с помощью инфраструктуры Meteor JavaScript, — это создать систему учетных записей пользователей. Просто установите пару пакетов — accounts-password и accounts-ui — и у вас получится следующий полнофункциональный интерфейс:

шаблон кнопок входа

Но хотя эта простота удобна, использование этого стандартного интерфейса не обеспечивает большой гибкости. Так что, если мы хотим создать пользовательский интерфейс для наших пользователей, чтобы зарегистрироваться и войти на наш сайт?

К счастью, это совсем не сложно. В этой статье я покажу вам, как создать пользовательскую форму входа и регистрации в Meteor. Однако в этой статье предполагается, что вы знаете, как настроить проект, используя эту платформу самостоятельно.

Чтобы поиграть с кодом, разработанным в этой статье, взгляните на репозиторий GitHub, который я настроил.

Основные настройки

Внутри нового проекта Meteor добавьте пакет с accounts-password , выполнив команду:

 meteor add accounts-password 

При добавлении этого пакета в проект будет Meteor.users коллекция Meteor.users для хранения данных нашего пользователя, и нам не придется писать собственную логику для функций, связанных с пользователем.

Таким образом, хотя создание пользовательского интерфейса означает, что мы потеряем удобство пакета accounts-ui , это не значит, что мы должны потерять удобство серверной «магии», которую может предоставить Meteor.

Разработка интерфейса

Для полной системы входа в систему и регистрации существует множество функций, для которых мы должны создать интерфейсы, включая:

  • постановка на учет
  • авторизоваться
  • забыл пароль
  • Страница «Подтвердите адрес электронной почты»
  • Страница с подтверждением электронной почты

Но на данный момент мы поговорим о первых двух перечисленных пунктах (регистрация и вход в систему). Причина в том, что вам не составит труда понять, как создавать другие интерфейсы, как только вы разберетесь с основами.

Следующий фрагмент кода показывает код регистрационной формы:

 <template name="register"> <form> <input type="email" name="registerEmail"> <input type="password" name="registerPassword"> <input type="submit" value="Register"> </form> </template> 

Следующий фрагмент показывает код формы входа в систему:

 <template name="login"> <form> <input type="email" name="loginEmail"> <input type="password" name="loginPassword"> <input type="submit" value="Login"> </form> </template> 

Как видите, шаблоны очень похожи. Они содержат форму, поля для адреса электронной почты и пароля, а также кнопку отправки. Единственная разница — это значение атрибута name для полей ввода и шаблона. (Мы скоро свяжемся с этими значениями, поэтому убедитесь, что они уникальны.)

Мы хотим, чтобы эти шаблоны отображались только для еще не зарегистрированных пользователей. Поэтому мы можем ссылаться на объект currentUser между открывающим и закрывающим тегами body :

 <head> <title>Custom Registration Tutorial</title> </head> <body> {{#if currentUser}} <p>You're logged in.</p> {{else}} {{> register}} {{> login}} {{/if}} </body> 

Этот код показывает сообщение «Вы вошли в систему», если текущий пользователь вошел в систему, а в противном случае — шаблоны «регистрация» и «вход».

Создание событий

На данный момент наши формы статичны. Чтобы они что-то сделали, нам нужно, чтобы они отреагировали на событие submit . Давайте продемонстрируем это, сосредоточившись на шаблоне «register».

В файле JavaScript проекта напишите следующее:

 if (Meteor.isClient) { Template.register.events({ 'submit form': function(event) { event.preventDefault(); console.log("Form submitted."); } }); } 

Здесь мы написали код так, чтобы форма внутри шаблона «register»:

  1. Ответы на событие submit
  2. Не имеет поведения по умолчанию
  3. Выводит подтверждающее сообщение на консоль

Мы также поместили этот код в isClient поскольку не хотим, чтобы этот код выполнялся на сервере (так как он предназначен только для интерфейса).

Внутри события мы хотим получить значения полей email и пароля и сохранить их в паре переменных. Итак, давайте изменим предыдущий код:

 Template.register.events({ 'submit form': function(event){ event.preventDefault(); var emailVar = event.target.registerEmail.value; var passwordVar = event.target.registerPassword.value; console.log("Form submitted."); } }); 

Для шаблона «логин» код практически идентичен:

 Template.login.events({ 'submit form': function(event) { event.preventDefault(); var emailVar = event.target.loginEmail.value; var passwordVar = event.target.loginPassword.value; console.log("Form submitted."); } }); 

Соединять вещи вместе

После добавления пакета accounts-password в проект нам стал доступен ряд методов:

  • Accounts.createUser()
  • Accounts.changePassword()
  • Accounts.forgotPassword()
  • Accounts.resetPassword()
  • Accounts.setPassword()
  • Accounts.verifyEmail()

Мы сосредоточимся на методе createUser но, основываясь на именах методов, нетрудно выяснить назначение других.

Внизу события submit для шаблона «регистрация» напишите:

 Accounts.createUser({ // options go here }); 

Это код, который мы можем использовать для создания нового пользователя, и по умолчанию он требует двух вариантов: адрес электронной почты и пароль.

Чтобы передать их, напишите:

 Accounts.createUser({ email: emailVar, password: passwordVar }); 

Окончательный код события должен выглядеть примерно так:

 Template.register.events({ 'submit form': function(event) { event.preventDefault(); var emailVar = event.target.registerEmail.value; var passwordVar = event.target.registerPassword.value; Accounts.createUser({ email: emailVar, password: passwordVar }); } }); 

Используя этот код вместо общей функции insert мы получаем преимущество в том, что пароли автоматически шифруются. Более того, пользователи регистрируются после регистрации, и нам не нужно писать много кода.

Существует также метод loginWithPassword() который мы можем использовать в событии «login»:

 Meteor.loginWithPassword(); 

Он также принимает значения электронной почты и пароля:

 Meteor.loginWithPassword(emailVar, passwordVar); 

И в контексте, вот как должен выглядеть код:

 Template.login.events({ 'submit form': function(event){ event.preventDefault(); var emailVar = event.target.loginEmail.value; var passwordVar = event.target.loginPassword.value; Meteor.loginWithPassword(emailVar, passwordVar); } }); 

Выйти

Теперь пользователи могут зарегистрироваться и войти в систему, но, чтобы позволить им выйти из системы, давайте сначала создадим новый шаблон «приборной панели», который будет отображаться при входе в систему:

 <template name="dashboard"> <p>You're logged in.</p> <p><a href="#" class="logout">Logout</a></p> </template> 

Затем включите следующий код в оператор if мы написали ранее в этой статье:

 <body> {{#if currentUser}} {{> dashboard}} {{else}} {{> register}} {{> login}} {{/if}} </body> 

Теперь мы можем создать событие, которое прикреплено к ссылке «выход из системы» в шаблоне «приборной панели»:

 Template.dashboard.events({ 'click .logout': function(event){ event.preventDefault(); } }); 

Чтобы выполнить процесс выхода из системы, нам нужно только использовать метод logout из logout как таковой:

 Template.dashboard.events({ 'click .logout': function(event){ event.preventDefault(); Meteor.logout(); } }); 

Регистрация, вход и выход теперь должны работать как положено.

Выводы

Мы добились значительного прогресса с небольшим количеством кода, но если мы хотим создать полный интерфейс для системы учетных записей, нам еще многое предстоит сделать.

Вот что я бы предложил:

  1. Включить проверку электронной почты нового пользователя .
  2. Подтвердите создание (и вход в систему) пользователей .
  3. Добавьте визуальную проверку в формы «регистрация» и «вход» .
  4. Сделайте что-нибудь, если попытка входа не удалась .
  5. Разрешить пользователям менять свой пароль .

Может потребоваться день, чтобы выяснить особенности того, как реализовать эти функции, но, исходя из того, что мы рассмотрели в этом руководстве, ни одна из них не будет недоступна для вас. Метеор делает тяжелую работу за нас.

Если вы хотите поиграть с кодом, разработанным в этой статье, взгляните на репозиторий GitHub, который я настроил.