Skip to content

Instantly share code, notes, and snippets.

@bibikovilya
Last active May 21, 2018 13:31
Show Gist options
  • Save bibikovilya/5cc77ae10515595f06a74618e34ad6ae to your computer and use it in GitHub Desktop.
Save bibikovilya/5cc77ae10515595f06a74618e34ad6ae to your computer and use it in GitHub Desktop.
Находки из текущего проекта: Auth0

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

Итак, auth0. Давно хотел это попробовать, и, получив новый проект, не смог удержаться.

Это third-party сервис, предназначенный для разработчиков, и он реализует в вашем приложении аутентификацию.

Что сразу хорошо, так это практически нулевой лаг при старте работы. Подключаешь по инструкции и сразу есть форма входа/регистрации и пара социальных сетей. Пара потому, что третья уже за деньги. В бесплатный пакет входит семь тысяч активных пользователей и два social network identity провайдера.

Даже приложение создавать не надо на фейсбуке! Подключение осуществляется по учётным данным самого auth0. Но вы всегда можете посоздавать свои приложения и добавить свои данные. Причём, это уже сразу сделано правильно, а не так, как мы делаем. В смысле, учётные данные заказчик сможет менять сам (а если вы всё сделаете правильно, то есть, по умолчанию, то и вообще добавлять новых провайдеров – тоже сам).

Сразу есть админка по пользователям и log in as.

Очень приятно это всё со стороны приложения. В таблице users у вас будет только одна “лишная” колонка: uid. И никакой логики аутентификации в классе User тоже не будет.

Некоторые советы:

  1. Как тестировать? Работает auth0 через oauth, так что, тестируем через стандартный short-cirquit.

    1.1. Но у меня нет ссылки, есть только этот их “lock”? Это неважно, адрес в приложении у вас тоже есть. Пишете всё то, что вики omniauth предлагает в rails_helper, а затем в тесте делаете visit '/auth/auth0'. Это уже отход от идеологии “правильных” интеграционных тестов, где вы делаете то же самое, что и ваш пользователь, но это работает, быстро и правильно. Кто освоит другой способ, скажите.

  2. Кастомные данные при регистрации. Инструкция работает.

    2.1. Слияние этих данных с данными из соцсетей. Тут есть тонкость, названия полей. В auth0 есть понятие нормализованный профиль пользователя, и именно под этими именами нужно перетягивать данные, которые вы тянете из формы. Вот наш код для этого:

function (user, context, callback) {
  user.user_metadata = user.user_metadata || {};
  user.given_name = user.given_name || user.user_metadata.given_name;
  user.family_name = user.family_name || user.user_metadata.family_name;
  callback(null, user, context);
}

Это то, что auth0 называет rules, и вообще этими rules стоит пользоваться. Ещё мы этим пользуемся для выдачи роли admin.

  1. state. В параметре state урла, на который будет идти ваш lock-виджет, вы можете передать информацию, которая дойдёт до принимающего контроллера. Так вы можете сделать несколько кнопок, вызывающих виджет, например, чтобы регистрироваться с разными тарифными планами.

  2. Только логин или только регистрация. Такая возможность есть, есть опции allowSignIn и allowSignUp и они работают. Но это не действует на кнопки социальных сетей, и вам придётся предусмотреть эту возможность. Мы это сделали посредством различных урлов (и эндпойнтов) для логина и регистрации, и первый из них сообщает об ошибке, если пользователя ещё нет, а второй, соответственно, если пользователь уже есть.

  3. authenticate_user вам придётся написать самому, это не очень сложно. Мы сохраняем урл, куда собирался пользователь, в сессию и при наличии такого урла в сессии вызываем lock.show(), так что, поведение очень похоже на поведение Devise.

  4. Мы сохраняем auth_hash в колонку типа json и всё поначалу читаем оттуда. Если какое-то значение очень часто и важно, вот его можно и денормализовать.

(C) https://github.com/dmitriy-kiriyenko

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment