Замітка «Відмова від реєстрації» розбурхала мій розум і я години 2 не міг заснути (чи це була чашка кави на ніч?..)
Я і раніше читав про «м'яку» реєстрацію, або відкладену реєстрацію, або «ненав'язливу» реєстрацію і тоді я для себе вирішив, що виходом буде OpenID і все, що на нього схоже. Але при роботі над поточним проектом я зрозумів, що це мені абсолютно не підходить.
Рішення прийшло якраз перед сном, а реалізацію зробив сьогодні вранці. Залишився задоволений.
Але, про все по порядку.
Почну з того, чим же мене не влаштував OpenID. Все просто. Цільова аудиторія сайту цього проекту, всі вони, звичайно, пристойні люди, в основному далекі від соціальних мереж (лісогосподарники) і можуть або не мати потрібних акаунтів зовсім, або їм буде важко зрозуміти, що від них хочуть, коли пропонують вибрати систему, через яку можна зареєструватися. Тому потрібно щось просте-просте, але не OpenID.
Думаю, всі пам'ятають чудовий радянський мультик про страуса і грифа, які сперечалися, що головне: ноги або крила. Їхня суперечка нагадує спроби вибрати між «спрощеною» реєстрацією і «зовсім спрощеною». Так от головне не ноги чи крила, а хвіст, у нашому випадку авторизація. Не важливо, наскільки проста реєстрація, важливі ті дані, за якими ми можемо авторизувати користувача в майбутньому. У підсумку користувач може і не помітити, що він вже «зареєструвався».
Формалізація ідеї
Кожна нова сесія - це новий користувач. Якщо буде вхід через день з того ж браузера і з того ж комп'ютера, то зрозуміло, що це той же користувач, якщо через місяць - це все одно той же користувач. Поки цього занадто мало для повноцінної авторизації, але лиха біда початок. Можна збільшити час зберігання ідентифікатора сеансу в куках у відвідувача і самій сесії на сервері. Думаю, навіть потрібно, для більшої надійності.
Якщо раптом користувачеві знадобилося десь на сайті ввести емейл, то: Ура! - тепер цей користувач не загубиться. Ми можемо дозволити йому ідентифікувати себе, запропонувавши ввести свій емейл, в будь-якому браузері і з будь-якого комп'ютера. Але до авторизації йому не буде доступна історія його взаємодії з нашим сайтом.
А ось, коли користувач захотів себе авторизувати, то ми висилаємо на його емейл пароль.
Тепер у нас є зареєстрований за всіма правилами користувач, причому лояльність цього користувача ІМХО значно вища, ніж у користувача, зареєстрованого за «стандартною» схемою.
Реалізація ідеї
Пропоную свою версію.
У мене в движку вже є модуль, що збирає статистику відвідувань. Зараз він зберігає в одну таблицю ідентифікатор сесії, ідентифікатор користувача (за замовчуванням це ідентифікатор гостя) і всю інформацію за запитом. Прибираємо з таблиці статистики ідентифікатор користувача і створюємо нову таблицю з двома полями:
- Ідентифікатор сеансу;
- Ідентифікатор користувача.
У цю таблицю будемо заносити інформацію, якщо:
- Створюємо нового користувача;
- Оновлюємо всі рядки з поточним безіменним користувачем після ідентифікації або авторизації поточного користувача.
Тим самим статистика ведеться абсолютно незалежно від процесів ідентифікації та авторизації, але вона у нас є майже вся, за будь-яким користувачем, незалежно від того, як швидко він став зареєстрованим.
Прив'язати в майбутньому до цієї схеми OpenID проблем не складе.
Для реалізації механізму збереження недозаповнених форм створюємо таку таблицю:
- Ідентифікатор сеансу;
- Ідентифікатор вигляду форми;
- Останній серіалізований пост запит, пов'язаний з формою.
Думаю ще зробити підстановку найбільш часто введених значень, але це пізніше.
Ще можна зробити таку корисну річ. Якщо у нас є якась конфіденційна інформація поточного користувача, і ми вже знаємо його емейл, то розміщуємо на видному місці посилання з текстом «Історію своїх замовлень (питань, претензій, запитів тощо) Ви можете побачити, ввівши свій емейл і пройшовши авторизацію». Так користувач буде розуміти, що його дізнаються і про нього пам'ятають.
Ув'язнення
Отже, питання реєстрації для мене більше не проблема. Сподіваюся, моє рішення стане в нагоді і в ваших проектах.
P.S. Прекрасний мультик про грифа, страуса і ящірку можна подивитися тут.
UPD:
Стандартна «явна» реєстрація теж реалізована. Зміна пароля і його відновлення є.
UPD2:
Сферою застосування запропонованого механізму бачу будь-який ресурс в незалежності від його складності і масштабності.
Поясню. Всі дії користувача будь-якого ресурсу можна розділити на три категорії:
- Не важливо хто робить, людина або робот (перехід по сторінках і, можливо, щось ще).
- Захист в цьому випадку не потрібен.
- Дія доступна будь-кому, хто зайшов на сайт.
- Важливо, що це робить людина (коментар на звичайному сайті та інша така ж проста дія).
- Захист - звичайна капча.
- Дія доступна будь-якому ідентифікованому користувачеві, тобто в нашому випадку будь-кому, хто зайшов на сайт, навіть роботу, якщо він впорається з капчею.
- Важливо, що це робить людина і що вона бере на себе відповідальність за цю дію (замовлення, пост, коментар на якомусь серйозному ресурсі).
- Захист - підтвердження по емейл.
- Доступно ідентифікованому користувачеві без підтвердженого емейлу (зрозуміло, що він може зробити це тільки один раз) і будь-якому авторизованому користувачеві.
З авторизованими користувачами все зрозуміло. Це стандартна ситуація.
Багато розмов про ідентифікованих, але не авторизованих користувачів.
Поки користувач жодного разу не ввів на сайті свій емейл, він вважається тільки ідентифікованим і може робити будь-які дії категорії 1 і 2 скільки завгодно разів. Також йому доступна будь-яка дія з категорії 3, але ТІЛЬКИ один раз. Після успішного виконання цієї дії такий користувач стає повністю зареєстрованим (ознака - наявність підтвердженого емейлу в його профілі), і наступного разу без авторизації він не зможе виконувати дії категорії 3. Тепер користувач повинен сам стежити, щоб його аккаунт не потрапив в чужі руки (наприклад, мами). Природно користувач повідомляється про це в листі. Природно у нього з'являється кнопка «Вийти».
UPD3:
Проблемна ситуація і її вирішення
Я ідентифікований користувач без підтвердженого емейлу або телефону зробив на сайті дію категорії 2. Протягом життя моєї сесії ще 100500 користувачів зробили на сайті дію (-ія) категорії 2.
З топіку випливає, що сайт буде думати, що один користувач, а саме я зробив всі ці 100501 дій категорії 2.
Необхідна поправка. Якщо персональні дані користувача без підтвердженого емейлу або телефону (перелік яких обрано заздалегідь для конкретного сайту) круто змінилися, то це новий користувач.
Прошу звернути увагу, що перелік персональних даних для кожного типу дії категорії 2 може бути різним в принципі і на різних сайтах зокрема і повинен вибиратися окремо в кожному конкретному випадку.
За докладний розгляд цього випадку окреме спасибі Nail13.
