Статьи

Аутентификация Twitter в Синатре

sinatra_twitter На недавнем саммите Awesome Hackathon в Манчестере моя команда работала над веб-приложением, которое обновляло биографию пользователя в различных социальных сетях в одном месте. Это означало, что я не мог разобраться с различными API-интерфейсами социальных сетей (это не очень хорошая вещь, которую я могу вам сказать). Я подумал, что быстро напишу, как вы можете аутентифицировать пользователей в приложении Sinatra, позволяя им входить в систему через Twitter.

Настройте сайт

Чтобы продемонстрировать эту работу, прежде всего, давайте настроим простое приложение, которое имеет два URL-адреса — публичный и приватный. Сохраните следующий код в файле с именем ‘main.rb’:

require 'sinatra' helpers do def admin? true end end get '/public' do "This is the public page - everybody is welcome!" end get '/private' do halt(401,'Not Authorized') unless admin? "This is the private page - members only" end 

Это устанавливает вспомогательный метод с именем admin? что мы можем использовать, чтобы проверить, вошел ли пользователь в систему. По умолчанию установлено значение true, чтобы мы могли проверить, что все работает. Мы также настроили два обработчика маршрута. Первый — для маршрута / public, который показывает сообщение всем, кто посещает.

Второй маршрут — это личная страница, которая будет показывать только сообщение admin? Помощник возвращает истину. Если нет, то мы используем метод остановки Sinatra, чтобы остановить приложение в его треках и показать сообщение «Not Authorized». Чтобы проверить, что это происходит, смените admin? вспомогательный метод для false, перезапустите сервер ( ruby main.rb ) и перейдите по адресу «http: // localhost: 4567 / private».

Использование сессий для входа и выхода

Мы можем добавить некоторые обработчики маршрутов, чтобы позволить пользователю входить и выходить из системы и использовать сеансы, чтобы отслеживать, вошел ли пользователь в систему или нет. Измените код в main.rb на следующий:

 require 'sinatra' configure do enable :sessions end helpers do def admin? session[:admin] end end get '/public' do "This is the public page - everybody is welcome!" end get '/private' do halt(401,'Not Authorized') unless admin? "This is the private page - members only" end get '/login' do session[:admin] = true "You are now logged in" end get '/logout' do session[:admin] = nil "You are now logged out" end 

Теперь перезапустите сервер и попробуйте перейти к «http: // localhost: 4567 / login», затем перейдите к «http: // localhost: 4567 / private», и вы сможете увидеть страницу. Перейдите к «http: // localhost: 4567 / logout», затем попробуйте «http: // localhost: 4567 / private» еще раз, и вы должны получить сообщение «Несанкционированный».

Отлично — у нас есть работающая система входа и выхода. Следующим шагом будет использование Twitter для аутентификации пользователя, вместо того, чтобы просто позволить кому-либо войти в систему, используя URL-адрес входа.

Зарегистрируйте свое приложение в Twitter

Прежде чем вы сможете начать использовать Twitter для входа в систему, вам необходимо зарегистрировать свое приложение в Twitter. Это легко сделать — просто зайдите на https://dev.twitter.com/apps и войдите в систему, используя свои учетные данные Twitter. Затем нажмите кнопку «Создать новое приложение» и заполните форму. Вы можете выбрать любое имя для своего приложения (если оно не содержит слово «Twitter») и использовать любой веб-сайт в качестве заполнителя, пока не получите фактическое доменное имя для своего приложения. Например, я использовал http://www.sitepoint.com.

В поле URL обратного вызова необходимо добавить /auth/twitter/callback к любому URL, который вы использовали в поле веб-сайта. Например, я использовал http://www.sitepoint.com/auth/twitter/callback. Затем вы попадете на страницу, содержащую настройки OAuth для вашего приложения. Запишите «потребительский ключ» и «потребительский секрет», так как мы будем использовать их в нашем приложении.

Ominauth

Библиотека, которую мы будем использовать для аутентификации, называется «omniauth». Как следует из названия, на самом деле его можно использовать для аутентификации в различных сервисах, таких как GitHub и Facebook. Он разделен на разные модули в зависимости от используемого сервиса, поэтому в этом случае нам нужно установить гем omniauth-twitter:

 $ gem install omniauth-twitter 

Далее вам нужно настроить ominauth, что можно сделать в начале main.rb:

 require 'sinatra' require 'omniauth-twitter' use OmniAuth::Builder do provider :twitter, 'put your consumer key here', 'put your consumer secret here' end 

Войдите через Twitter

Нам нужно создать вход с помощью функции Twitter. Прежде всего, мы отредактируем наш обработчик маршрута ‘/ login’, чтобы он перенаправлял на URL, который был автоматически установлен Omniauth:

 get '/login' do redirect to("/auth/twitter") end 

Обратите внимание, что если вы используете GitHub, URL будет «/ auth / github». Это приведет пользователя в Twitter и спросит его, можно ли разрешить вашему приложению доступ к Twitter.

Если вход выполнен успешно, он вызывает обратный вызов «/ auth / twitter / callback». Все, что нам нужно сделать сейчас, — это создать обработчик маршрута, чтобы иметь дело с тем, что мы хотим, чтобы после успешного входа в систему. Это тот же код, который мы использовали ранее в обработчике маршрута входа в систему:

 get '/auth/twitter/callback' do env['omniauth.auth'] ? session[:admin] = true : halt(401,'Not Authorized') "You are now logged in" end 

Существует также маршрут для обработки неудачного входа в систему, для которого нам нужно создать обработчик:

 get '/auth/failure' do params[:message] end 

Это отображает сообщение, отправленное обратно из Twitter, о том, почему аутентификация не удалась.

Теперь у нас есть полнофункциональная система входа в систему, которая использует Twitter для аутентификации. Это одна из вещей, которые мне нравятся в Sinatra — мы создали полнофункциональную систему входа в систему, которая использует Twitter для аутентификации примерно в 40 строках кода!

Использование учетных данных Twitter

Теперь, когда кто-то вошел в систему через Twitter, что мы можем сделать?

Когда пользователь входит в систему через Twitter, вы фактически получаете доступ к большому количеству информации о нем. Это хранится в хэше env['omniauth.auth'] . Чтобы увидеть, как это выглядит, измените обработчик маршрута обратного вызова на следующий:

 get '/auth/twitter/callback' do session[:admin] = true env['omniauth.auth'] end 

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

Например, вы можете пригласить пользователя на свой сайт следующим образом:

 get '/auth/twitter/callback' do session[:admin] = true "<h1>Hi #{env['omniauth.auth']['info']['name']}!</h1><img src='#{env['omniauth.auth']['info']['image']}'>" end 

Это даст им персональный прием и покажет их фотографию в Твиттере. Если вы хотите продолжить использовать эти детали, вы можете сохранить их в хеше сессии, например:

 get '/auth/twitter/callback' do session[:admin] = true session[:username] = env['omniauth.auth']['info']['name'] "<h1>Hi #{session[:username]}!</h1>" end 

Вы также можете использовать это как способ аутентификации пользователей, которые вы сохранили в базе данных. Twitter предоставляет всем своим пользователям уникальный идентификатор, который может быть свойством модели User. Затем вы можете выглядеть как пользователь (в этом примере используется синтаксис Mongoid, но вы должны быть в состоянии заставить его работать для вашего ORM по выбору:

 @user = User.where(twitter_id: env['omniauth.auth']['uid'] 

Обновление Twitter

После того как вы авторизуете пользователя в Twitter, вы можете теоретически продолжить и начать манипулировать его аккаунтом в Twitter. То, что вам разрешено делать, зависит от того, какой доступ пользователь предоставляет приложению (вы можете выбрать, хотите ли вы только чтение или чтение и запись для вашего приложения, на вкладке настроек на сайте разработчика Twitter). На самом деле Omniauth не позволяет вам манипулировать аккаунтом в твиттере. Для этого вам нужно будет установить твиттер . Недостаточно места для того, чтобы использовать это сейчас, может быть, в будущем посте … но вы можете поэкспериментировать с этим самим.