class SocialNetworksLib

Public Instance Methods

side_signin(sign_as, user_id, email, access_token, token_expired) click to toggle source
# File lib/social_networks.rb, line 3
def side_signin sign_as, user_id, email, access_token, token_expired
  # решил прикрепить скрепу!
  if @current_user
    access_card_exist = OauthAccessCard.find_by({oauth_name: sign_as, oauth_uid: user_id})
    access_card = @current_user.oauth_access_cards.find_by({oauth_name: sign_as, oauth_uid: user_id})
    if access_card.nil?
      if access_card_exist
        # спизданул
        u = access_card_exist.user_card
        access_card_exist.update(user_id: @current_user.id)
        access_card = access_card_exist
        # если забрал последнюю скрепу и нет больше карточек доступа - дезинтегрируем юзера
        if u.access_cards_count == 0
          u.destroy
        else
          u.set_active_card
        end
      else
        # прикрепил
        access_card = @current_user.oauth_access_cards.create({oauth_name: sign_as, oauth_uid: user_id, access_token: access_token, token_expired: token_expired})
      end
    else
      # просто заапдейтил токен
      access_card.update(access_token: access_token, token_expired: token_expired)
    end

    social_network_api :update_user_profile, sign_as, access_card # дополнение профиля пользователя данными из соц сети
    set_cookies @current_user, access_card

  else

    access_card = OauthAccessCard.find_by({oauth_name: sign_as, oauth_uid: user_id})

    if access_card
      user = access_card.user_card
      access_card.update(access_token: access_token, token_expired: token_expired)
      social_network_api :update_user_profile, sign_as, access_card # дополнение профиля пользователя данными из соц сети
      user.authenticate(user.password)

      set_cookies user, access_card

    else

      # создаём клиента
      user = UserCard.new get_params ActionController::Parameters.new({user: {password: SecureRandom.hex(8), oauth_access_cards_attributes: [oauth_name: sign_as, oauth_uid: user_id, access_token: access_token, token_expired: token_expired]}})

      if user.save
        # печеньки для кабеля
        access_card = user.oauth_access_cards.first
        set_cookies user, access_card

        social_network_api :update_user_profile, sign_as, access_card # дополнение профиля пользователя данными из соц сети

      else
        msg = ''
        user.errors.full_messages.each do |message|
          msg += message
        end
        @result = {type: :bad, msg: msg}

      end

    end

  end

  redirect_to profile_path

end
social_network_auth() click to toggle source
# File lib/social_networks.rb, line 73
def social_network_auth
  social_network = params[:social_network]
  rerequest = params[:rerequest].present?? {auth_type: 'rerequest'} : nil # https, reauthenticate, rerequest
  social_network_auth_request social_network, :step1, rerequest
end
social_network_verify_fb() click to toggle source
# File lib/social_networks.rb, line 84
def social_network_verify_fb
  result = verify_vk_fb_yandex_mailru_google params # предварительный результат, даёт только result['access_token'], result['expires_in']
  # проверка привелегий которые пользователь разрешил с полным списком необходимых
  # zuker_result = inspecting_access_token :fb, result['access_token']
  # missed_permissions = get_missed_permissions :fb, zuker_result['data']['scopes']
  # unless missed_permissions.empty?
  #   redirect_to social_network_auth_path(social_network: :fb, rerequest: true), method: :post, notice: "для использования сайта необходимо разрешить привелегии: #{missed_permissions.to_s}"
  # else
  reg_info = get_reg_info :fb, {access_token: result['access_token']} # а здесь мы получаем и дополнительную информацию
  side_signin :fb, reg_info['id'], reg_info['email'], result['access_token'], (DateTime.now + result['expires_in'].second).to_s(:db)
  # end
  # declined_permissions = get_declined_permissions :fb, result['access_token']

  #zuker_result = inspecting_access_token :fb, result['access_token']['data'] # цукермановый результат - это типа разшифровка полученного того результата с помощью полученного токена приложения
end
social_network_verify_google() click to toggle source
# File lib/social_networks.rb, line 100
def social_network_verify_google
  result = verify_vk_fb_yandex_mailru_google params
  user_info = get_user_info :google, {access_token: result['access_token']} # а здесь мы получаем и дополнительную информацию
  side_signin :google, user_info['id'], user_info['email'], result['access_token'], (DateTime.now + result['expires_in'].second).to_s(:db)
end
social_network_verify_mailru() click to toggle source
# File lib/social_networks.rb, line 112
def social_network_verify_mailru
  result = verify_vk_fb_yandex_mailru_google params
  user_info = get_user_info :mailru, {session_key: result['access_token'], uid: result['x_mailru_vid']} # а здесь мы получаем и дополнительную информацию
  side_signin :mailru, result['x_mailru_vid'], user_info['email'], result['access_token'], (DateTime.now + result['expires_in'].second).to_s(:db)
end
social_network_verify_vk() click to toggle source
# File lib/social_networks.rb, line 79
def social_network_verify_vk
  result = verify_vk_fb_yandex_mailru_google params
  side_signin :vk, result['user_id'], result['email'], result['access_token'], (DateTime.now + result['expires_in'].second).to_s(:db)
end
social_network_verify_yandex() click to toggle source
# File lib/social_networks.rb, line 106
def social_network_verify_yandex
  result = verify_vk_fb_yandex_mailru_google params
  user_info = get_user_info :yandex, {oauth_token: result['access_token']} # а здесь мы получаем и дополнительную информацию
  side_signin :yandex, user_info['id'], user_info['default_email'], result['access_token'], (DateTime.now + result['expires_in'].second).to_s(:db)
end

Private Instance Methods

check_social_network_access_token_expired(uid) click to toggle source
# File lib/social_networks.rb, line 120
def check_social_network_access_token_expired uid
  user = UserCard.find(uid)
  redirect_to logout_path if DateTime.now > user.token_expired.to_datetime
end
get_age(bday) click to toggle source
# File lib/social_networks.rb, line 324
def get_age bday
  TimeDifference.between(bday, DateTime.now).in_years.floor
end
get_declined_permissions(social_network, access_token) click to toggle source
# File lib/social_networks.rb, line 287
def get_declined_permissions social_network, access_token
  case social_network
    when :fb
      uri = URI "#{CONFIG[social_network][:api][:uri]}#{CONFIG[social_network][:api][:check_permissions][:prefix]}"
      params = {access_token: access_token}
      uri.query = URI.encode_www_form params
      result = Net::HTTP.get_response uri

      permissions = ActiveSupport::JSON.decode(result.body)['data'].map { |permission_obj| permission_obj['permission'] if permission_obj['status'] == 'declined' }.compact

      permissions.empty?? nil : permissions
  end
end
get_missed_permissions(social_network, scopes) click to toggle source
# File lib/social_networks.rb, line 283
def get_missed_permissions social_network, scopes
  CONFIG[social_network][:auth][:step1][:scope].split(',') - scopes
end
get_reg_info(social_network, access_params) click to toggle source
# File lib/social_networks.rb, line 270
def get_reg_info social_network, access_params
  case social_network
    when :fb
      uri = URI CONFIG[social_network][:api][:uri]
      params = CONFIG[social_network][:api][:get_reg_info][:params]
      params.merge!(access_params) unless access_params.nil?
      uri.query = URI.encode_www_form params
      result = Net::HTTP.get_response uri

      ActiveSupport::JSON.decode(result.body)
  end
end
get_sex(sex, network) click to toggle source
# File lib/social_networks.rb, line 301
def get_sex sex, network
  case network
    when :vk
      case sex.to_i
        when 1
          :female
        when 2
          :male
        else
          nil
      end
    when :mailru
      case sex.to_i
        when 0
          :male
        when 1
          :female
        else
          nil
      end
  end
end
get_user_info(social_network, access_params) click to toggle source
# File lib/social_networks.rb, line 210
def get_user_info social_network, access_params
  case social_network
    when :vk
      uri = URI "#{CONFIG[social_network][:api][:uri]}#{CONFIG[social_network][:api][:users_get][:prefix]}"
      params = CONFIG[social_network][:api][:united_params].merge!(CONFIG[social_network][:api][:users_get][:params])
      params.merge!(access_params) unless access_params.nil?
      uri.query = URI.encode_www_form params
      result = Net::HTTP.get_response uri

      ActiveSupport::JSON.decode(result.body)['response'][0]
    when :fb
      uri = URI CONFIG[social_network][:api][:uri]
      params = CONFIG[social_network][:api][:get_user_info][:params]
      params.merge!(access_params) unless access_params.nil?
      uri.query = URI.encode_www_form params
      result = Net::HTTP.get_response uri

      ActiveSupport::JSON.decode(result.body)
    when :google
      uri = URI CONFIG[social_network][:api][:get_user_info][:uri]
      params = access_params
      uri.query = URI.encode_www_form params
      result = Net::HTTP.get_response uri

      ActiveSupport::JSON.decode(result.body)
    when :yandex
      uri = URI CONFIG[social_network][:api][:get_user_info][:uri]
      params = CONFIG[social_network][:api][:get_user_info][:params]
      params.merge!(access_params) unless access_params.nil?
      uri.query = URI.encode_www_form params
      result = Net::HTTP.get_response uri

      ActiveSupport::JSON.decode(result.body)
    when :mailru
      uri = URI CONFIG[social_network][:api][:get_user_info][:uri]
      params = CONFIG[social_network][:api][:get_user_info][:params]
      params.merge!(access_params) unless access_params.nil?
      sig = Digest::MD5.hexdigest params.sort.map{|k,v| "#{k}=#{v}"}.join() + CONFIG[social_network][:auth][:step2][:client_secret] # охуенная подпись !
      params = params.merge({sig: sig})
      uri.query = URI.encode_www_form params
      result = Net::HTTP.get_response uri

      ActiveSupport::JSON.decode(result.body)[0]
  end

end
get_user_picture(social_network, width, height, access_params) click to toggle source
# File lib/social_networks.rb, line 257
def get_user_picture social_network, width, height, access_params
  case social_network
    when :fb
      uri = URI "#{CONFIG[social_network][:api][:uri]}#{CONFIG[social_network][:api][:get_picture][:prefix]}"
      params = {width: width, height: height, redirect: false}
      params.merge!(access_params) unless access_params.nil?
      uri.query = URI.encode_www_form params
      result = Net::HTTP.get_response uri

      ActiveSupport::JSON.decode(result.body)
  end
end
social_network_api(req, social_network, access_card) click to toggle source
# File lib/social_networks.rb, line 125
def social_network_api req, social_network, access_card

  case req
    when :update_user_profile
      case social_network
        when :vk
          add_info = get_user_info social_network, {access_token: access_card.access_token}
          p add_info
          # заливка инфы из соцсети (имя, фамилия, клёвая ава, возраст, пол)

          sex = get_sex add_info['sex'], social_network
          age = add_info['bdate'].present? ? (get_age DateTime.strptime(add_info['bdate'],'%d.%m.%Y')) : nil

          params = {
                                                                   firstname:  add_info['first_name'],
                                                                   lastname:   add_info['last_name'],
                                                                   # nickname:   add_info['nickname'],
                                                                   sex:        sex,
                                                                   age:        age,
                                                                   # city:       add_info[:city][:title],
                                                                   photourl:   add_info['photo_100']
                                                               }

        when :fb
          add_info = get_user_info social_network, {:access_token => access_card.access_token}
          picture = get_user_picture social_network, 100, 100, {:access_token => access_card.access_token}
          age = add_info['birthday'].present? ? (get_age DateTime.strptime(add_info['birthday'],'%m/%d/%Y')) : nil

          params = {
                                                                   firstname:  add_info['first_name'],
                                                                   lastname:   add_info['last_name'],
                                                                   # nickname:   add_info['middle_name'],
                                                                   sex:        add_info['gender'],
                                                                   age:        age,
                                                                   # city:       add_info[:location][:name],
                                                                   photourl:   picture['data']['url']
                                                               }
        when :google
          add_info = get_user_info social_network, {:access_token => access_card.access_token}
          params = {
                                                                   firstname:  add_info['given_name'],
                                                                   lastname:   add_info['family_name'],
                                                                   # nickname:   add_info['name'],
                                                                   sex:        add_info['gender'],
                                                                   age:        nil,
                                                                   # city:       add_info[:location][:name],
                                                                   photourl:   add_info['picture']
                                                               }
        when :yandex
          add_info = get_user_info social_network, {:access_token => access_card.access_token}
          picture = add_info['default_avatar_id'] == '0/0-0' ? nil : "https://avatars.yandex.net/get-yapic/#{add_info['default_avatar_id']}/islands-retina-50"
          age = add_info['birthday'].present? ? (get_age DateTime.strptime(add_info['birthday'],'%Y-%m-%d')) : nil

          params = {
                                                                   firstname:  add_info['first_name'],
                                                                   lastname:   add_info['last_name'],
                                                                   # nickname:   add_info['real_name'],
                                                                   sex:        add_info['sex'],
                                                                   age:        age,
                                                                   # city:       add_info[:location][:name],
                                                                   photourl:   picture
                                                               }

        when :mailru
          add_info = get_user_info social_network, {session_key: access_card.access_token, uid: access_card.oauth_uid} # а здесь мы получаем и дополнительную информацию
          picture = add_info['has_pic'].to_i == 0 ? nil : add_info['pic_128']
          sex = get_sex add_info['sex'], social_network
          age = add_info['birthday'].present? ? (get_age DateTime.strptime(add_info['birthday'],'%d.%m.%Y')) : nil

          params = {
                                                                   firstname:  add_info['first_name'],
                                                                   lastname:   add_info['last_name'],
                                                                   # nickname:   add_info['nick'],
                                                                   sex:        sex,
                                                                   age:        age,
                                                                   # city:       add_info[:location][:name],
                                                                   photourl:   picture
                                                               }

      end
  end

  access_card.update(params)
end