вівторок, 21 червня 2011 р.

ВКонтакте → Авторизація Standalone-додатків використовуючи OAuth 2.0 на прикладі Ruby і Mechanize

Про авторизацію Desktop-додатків ВКонтакте на прикладі Ruby і Mechanize я писав більше року тому. З того часу спливло чимало води:
  • Для авторизації додатків використовується відкритий протокол OAuth 2.0.
  • Запити до API здійснюються без необхідності їх підписувати, завдяки використанню протоколу HTTPS.
Про серверну авторизація ВКонтакте використовуючи OAuth 2.0 я вже писав у цій статті на прикладі Sinatra. У цій статті мова про клієнтську авторизації на прикладі Mechanize.

Поїхали!

Підключаємо необхідні бібліотеки:
require 'oauth2'
require 'mechanize'
view raw 1.rb hosted with ❤ by GitHub

Створюємо екземпляр класу OAuth2::Client:
@client = OAuth2::Client.new(
'client_id',
'client_secret',
:site => 'https://api.vk.com/',
:token_url => '/oauth/token',
:authorize_url => '/oauth/authorize'
)
view raw 2.rb hosted with ❤ by GitHub

Для початку процесу авторизації необхідно створити вікно браузера і відкрити в ньому діалог авторизації за адресою, отриманою від клієнта OAuth2:
auth_url = @client.auth_code.authorize_url(
:redirect_uri => 'http://api.vk.com/blank.html',
:scope => '',
:display => 'wap'
)
agent = Mechanize.new{|a| a.user_agent_alias = 'Linux Konqueror'}
login_page = agent.get(auth_url)
view raw 3.rb hosted with ❤ by GitHub

В діалоговому вікні буде запропоновано ввести логін і пароль.
login_form = login_page.forms.first
login_form.email = 'email'
login_form.pass = 'pass'
verify_page = login_form.submit
view raw 4.rb hosted with ❤ by GitHub

Після успішного входу на сайт буде запропоновано авторизувати додаток(якщо це не так), дозволивши доступ до необхідних налаштувань, запитаних параметром scope(детальніше тут).
if verify_page.uri.path == '/oauth/authorize'
if /m=4/.match(verify_page.uri.query)
raise "Вказано невірний логін або пароль."
elsif /s=1/.match(verify_page.uri.query)
grant_access_page = verify_page.forms.first.submit
end
else
grant_access_page = verify_page
end
view raw 5.rb hosted with ❤ by GitHub

Після успішної авторизації браузер буде перенаправлено за адресою :redirect_uri, вказаною при відкритті діалогу авторизації. При цьому код для отримання access_token буде переданий в URL-фрагменті посилання.
code = /code=(?<code>.*)/.match(grant_access_page.uri.fragment)['code']
view raw 6.rb hosted with ❤ by GitHub

Отримуємо access_token:
@access_token = @client.auth_code.get_token(code)
@access_token.options[:param_name] = 'access_token'
@access_token.options[:mode] = :query
view raw 7.rb hosted with ❤ by GitHub

Після успішної авторизації можна здійснювати запити до API.
@access_token.get('/method/getProfiles', :params => {:uids => '1', :fields => 'city,country'}).parsed
view raw 8.rb hosted with ❤ by GitHub

P.S. Посилання на мою бібліотеку для авторизації ВКонтакте і здійснення запитів до API.

Немає коментарів: