Мы делали на Ember.js, но смысл тот же - фреймворк можно вообще не использовать.
https://github.com/incubus/omniauth-odnoklassniki - ставим себе гем для айтентификации.
По нажатию на кнопку - открываем новое окно с адресом аутентефикации
Пример кода на Ember.js но смысл должен быть понятен
SomeApp.SocialLoginButtonView = Ember.View.extend(
tagName: "a"
attributeBindings: ['href']
click: (e)->
e.preventDefault()
provider = $(e.currentTarget).attr('href')
url = "/users/auth/#{provider}?transition_to_root=true"
window.open(
url, '_blank',
'width=600,height=500,location=yes,resizable=yes,scrollbars=yes'
)
)
Пример контроллера
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
layout 'blank'
def facebook
sign_in_with_oauth_data(request.env['omniauth.auth'])
end
def twitter
sign_in_with_oauth_data(request.env['omniauth.auth'])
end
private
def sign_in_with_oauth_data(oauth_data)
unless user_signed_in?
user = User.find_or_create_with_oauth(oauth_data)
sign_in :user, user
MailWorker.perform_in(1.hour, user.id, :account_dropoff)
end
@success = current_user.register_social_profile(normalize_oauth_data(oauth_data))
@service_name = oauth_data.provider
render 'shared/social_authentication'
end
def normalize_oauth_data(oauth_data)
{ service_name: oauth_data.provider, uid: oauth_data.uid, access_token: oauth_data.credentials.token, secret_key: oauth_data.credentials.secret }
end
end
Контроллер рендерит представление - javascript, который отправляет данные родительскому окну и закрывает окно авторизации
<script type="text/javascript" charset="UTF-8">
<% if @success %>
window.opener.SomeApp.sendSuccess()
<% else %>
window.opener.SomeApp.sendFailure()
<% end %>
window.close();
</script>