пʼятниця, 20 травня 2011 р.

OmniAuth: Зовнішня, проста автентифікація для Rack на прикладі Sinatra і ВКонтакте

В останні один-два роки веб-додатки зазнали радикальних змін. Час, коли кожен сайт представляв собою бункер, який чекає приходу нових користувачів поступово проходить. Я роздратовано зітхаю кожен раз, коли мені доводиться заповнювати чергову реєстраційну форму замість того, щоб скористатися "Connect with Facebook", "Sing in with Twitter" або "Log in with OpenID". Зараз веб-додатки стають все більш відкритими світу. Один з кращих способів збільшення популярності та життєздатності нового сервісу є його доповнення існуючими базами користувачів таких додатків, як: Twitter, Facebook, ВКонтакте, тощо.

Нещодавно я писав про авторизацію додатків ВКонтакте використовуючи відкритий протокол OAuth 2.0. У цій статті мова піде про OmniAuth.

OmniAuth - система аутентифікації заснована на Rack, яка значно спрощує зовнішню аутентифікацію в тому сенсі, що вам немає потреби розбиратися в API провайдерів, а також не вимагає ніякої інформації про те, що буде відбуватися з надіcланими після аутентифікації даними.

Що це означає для вас? Це означає, що ви можете легко реалізувати аутентифікацію в вашому додатку через Twitter, Facebook, LinkedIn, Google, GitHub, ВКонтакте, Mailru і т.д. І потім мати повний контроль над нею.


Встановлення

OmniAuth доступна у вигляді gem'а:
$ gem install omniauth

Використання

Використовувати OmniAuth так само просто як і будь-яке інше Rack middleware. Немає складної конфігурації під конкретний фреймворк, тільки набір middleware для спрощення реалізації зовнішньої авторизації. Давайте уявимо, що у нас є веб-додаток розроблений на Sinatra, у який нам потрібно додати аутентифікацію через ВКонтакте. Ось, що ми зробимо:
# -*- encoding: utf-8 -*-

require 'sinatra'
require 'omniauth'

VKONTAKTE_API_ID     = '***'
VKONTAKTE_SECRET_KEY = '***'

use Rack::Session::Cookie
use OmniAuth::Builder do
  provider :vkontakte, VKONTAKTE_API_ID, VKONTAKTE_SECRET_KEY
end

Захисний ключ(VKONTAKTE_SECRET_KEY) та ID додатку(VKONTAKTE_API_ID) ви може дізнатися на сторінці налаштувань вашого додатку.

Тепер, якщо я захочете, щоб користувач пройшов аутентифікацію через ВКонтакте, відсилайте його за адресою /auth/vkontakte:
get '/' do
  <<-HTML
  <a href='/auth/vkontakte'>Sign in with Vkontakte</a>
  HTML
end
Користувач буде автоматично перенаправлений на відповідний сайт, де він зможе пройти аутентифікацію. Як тільки аутентифікація завершена, користувач буде перенаправлений назад до /auth/:provider/callback, і OmniAuth автоматично заповнить ключ оточення omniauth.auth інформацією про користувача. Таким чином для клієнта на Sinatra достатньо додати:
get '/auth/:name/callback' do
  auth = request.env['omniauth.auth']
  "Hello, #{auth['user_info']['name']}, you logged in via #{auth['provider']}."
end
У підсумку на сторінку буде виведено ім'я користувача, який пройшов авторизацію.
Звичайно, ми можемо зробити щось більше, ніж просто надрукувати ім'я користувача. Але це вже тема для іншої статті...

Додаткові матеріали

1 коментар:

superp сказав...

Якщо потрібно буде постити на стіну у фейсбук чи писати твіти, тоді згодиться моя стаття про те як це можна зробити через OmniAuth:
http://superp.tumblr.com/post/4109090091/publish-stream-in-facebook-twitter-with-omniauth