• Как сделать аутентификацию через одноклассники на Angularjs?

    c3gdlk
    @c3gdlk
    Ментор в http://rubyboost.ru/
    Мы делали на 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>
    Ответ написан
    1 комментарий