Я пережив це через sled.com. Тут виникає декілька проблем щодо створення облікових записів та підтримки декількох сторонніх облікових записів для входу. Деякі з них:
- Чи потрібно підтримувати локальний пароль та сторонні входи?
Для sled.com я вирішив скасувати локальний пароль через невелике значення, яке він додає, та додаткову вартість при забезпеченні форми введення пароля. Існує багато відомих атак для злому паролів, і якщо ви збираєтеся вводити паролі, ви повинні переконатися, що їх непросто зламати. Також потрібно зберігати їх в односторонньому хеші або щось подібне, щоб запобігти їх просоченню.
- Яку гнучкість ви хочете дозволити для підтримки декількох сторонніх облікових записів?
Здається, ви вже вибрали трьох постачальників послуг входу: Facebook, Twitter та LinkedIn. Це чудово, адже це означає, що ви використовуєте OAuth та працюєте з чітко визначеним набором надійних постачальників. Я не фанат OpenID. Залишилося питання, чи потрібно вам підтримувати декілька сторонніх облікових записів від одного постачальника (наприклад, один локальний обліковий запис з двома обліковими записами Twitter). Я припускаю, що ні, але якщо ви це зробите, вам потрібно буде врахувати це у вашій моделі даних.
Для Sled ми підтримуємо вхід у систему з Facebook, Twitter та Yahoo! і в кожному обліковому записі користувача зберігається ключ для кожного: {"_id": "djdjd99dj", "yahoo": "dj39djdj", twitter: "3723828732", "facebook": "12837287"}. Ми встановлюємо купу обмежень, щоб гарантувати, що кожен сторонній обліковий запис може бути пов'язаний лише з одним локальним обліковим записом.
Якщо ви збираєтесь дозволити кілька облікових записів від одного і того ж стороннього постачальника, вам потрібно буде використовувати списки чи інші структури для підтримки цього, а з цим і всі інші обмеження, щоб забезпечити унікальність.
- Як пов’язати кілька облікових записів?
Перший раз, коли користувач підписується на вашу послугу, вони спочатку переходять до стороннього постачальника та повертаються із підтвердженим стороннім ідентифікатором. Потім ви створюєте для них локальний рахунок і збираєте будь-яку іншу інформацію, яку ви хочете. Ми збираємо їх електронну адресу і також просимо вибрати місцеве ім’я користувача (ми намагаємося попередньо заповнити форму наявним ім'ям користувача від іншого постачальника). Наявність певної форми локального ідентифікатора (електронна пошта, ім’я користувача) дуже важлива для подальшого відновлення облікового запису.
Сервер знає, що це перший раз вхід у систему, якщо у веб-переглядача немає файлу cookie сеансу (дійсний або закінчився термін дії) для існуючого облікового запису, і що сторонній обліковий запис, який використовується, не знайдено. Ми намагаємось повідомити користувача, що вони не просто входять у систему, але створюють новий обліковий запис, щоб, якщо у них вже є обліковий запис, вони, сподіваючись, призупиняться та ввійдуть із наявним обліковим записом.
Ми використовуємо такий самий потік, щоб пов’язати додаткові облікові записи, але коли користувач повертається від третьої сторони, наявність дійсного файлу cookie сеансу використовується для розмежування спроби прив’язати новий обліковий запис до дії входу. Ми дозволяємо лише один сторонній обліковий запис кожного типу, і якщо вже є один пов'язаний, блокуйте дію. Це не повинно бути проблемою, оскільки інтерфейс для підключення нового облікового запису відключений, якщо у вас вже є (на кожного постачальника), але про всяк випадок.
Якщо користувач спробував зв’язати новий обліковий запис сторонньої сторони, який уже пов'язаний з локальним обліковим записом, ви просто запропонуєте їм підтвердити, що вони хочуть об'єднати два облікові записи (якщо припустити, що ви можете обробити таке злиття зі своїм набором даних - часто простіше сказати ніж зроблено). Ви також можете надати їм спеціальну кнопку, щоб надіслати запит на об'єднання, але на практиці все, що вони роблять, - це пов’язати інший рахунок.
Це досить проста державна машина. Користувач повертається від сторонньої сторони з ідентифікатором стороннього облікового запису. Ваша база даних може бути в одному з трьох станів:
- Обліковий запис пов’язано з локальним обліковим записом, а cookie сеансу немає -> Вхід
- Обліковий запис пов’язано з локальним обліковим записом, а сесійне cookie -> Об’єднання
- Обліковий запис не пов’язаний з локальним обліковим записом, а cookie сеансу немає -> Реєстрація
Обліковий запис не пов’язаний з локальним обліковим записом, а сесійне cookie -> Пов’язання додаткового облікового запису
- Як виконати відновлення облікового запису у сторонніх постачальників послуг?
Це ще експериментальна територія. Я не бачив ідеального UX для цього, оскільки більшість сервісів надають локальний пароль поруч із сторонніми обліковими записами, і тому зосереджуюсь на випадку використання "забув мій пароль", а не на всьому іншому, що може піти не так.
З Sled ми вирішили використовувати "Потрібна допомога входу?" а після натискання запитайте у користувача його електронну пошту чи ім’я користувача. Ми шукаємо це, і якщо ми знайдемо відповідний обліковий запис, надішлемо цьому користувачеві посилання, яке може автоматично увійти в службу (добре на один раз). Після цього ми переносимо їх безпосередньо на сторінку посилання на обліковий запис, повідомляємо їм, що вони повинні переглянути і, можливо, зв’язати додаткові облікові записи, і покажемо їм сторонні облікові записи, з якими вони вже пов’язані.