Module: PlataformaSocial::Facebook

Included in:
ActionController::Base
Defined in:
lib/plataforma_social/facebook.rb

Instance Method Summary collapse

Instance Method Details

#facebook_loginObject



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/plataforma_social/facebook.rb', line 6

def 
  load_oauth
  load_graph

  redirect = false

  if params[:code]
    begin
      @oauth.get_access_token(params[:code])
    rescue Koala::Facebook::OAuthTokenRequestError
      redirect = true if parse_facebook_signed_request && !parse_facebook_signed_request['oauth_token']
    end
  else
    redirect = true if parse_facebook_signed_request && !parse_facebook_signed_request['oauth_token']
  end

  if parse_facebook_signed_request && parse_facebook_signed_request['oauth_token']
    if parse_facebook_signed_request['expires'] > Time.now.to_i # Se o access_token do usuário não estiver expirado
      if !session[:not_verify_facebook_permissions] == true
        begin
          permissions = @graph.get_object('me', :fields => 'permissions')['permissions']['data'][0]
          session[:not_verify_facebook_permissions] = true

          PlataformaSocial.facebook_scope.split(',').each do |permission|
            redirect = true unless permissions[permission.strip]
          end
        rescue Koala::Facebook::AuthenticationError
          redirect = true

          # Remove o signed_request da URL já que ele está expirado e recarrega o objeto do @oauth
          if params[:callback_url].present?
            params[:callback_url].gsub!("signed_request=#{params[:signed_request]}", "")
          elsif request.present?
            request.fullpath.gsub!("signed_request=#{params[:signed_request]}", "")
          else
            PlataformaSocial.facebook_callback_url.to_s.gsub!("signed_request=#{params[:signed_request]}", "")
          end

          load_oauth
        end
      end
    else
      redirect = true
    end
  end

  if redirect
    render :text => %|<script type="text/javascript">window.top.location.href="#{@oauth.url_for_oauth_code(:permissions => PlataformaSocial.configuration.facebook_scope)}";</script>|
  end
end

#facebook_user_dataObject



103
104
105
106
107
# File 'lib/plataforma_social/facebook.rb', line 103

def facebook_user_data
  if load_graph
    @graph.get_object('me')
  end
end

#load_graphObject



145
146
147
# File 'lib/plataforma_social/facebook.rb', line 145

def load_graph
  @graph = Koala::Facebook::API.new parse_facebook_signed_request['oauth_token'] if parse_facebook_signed_request.present? && parse_facebook_signed_request['oauth_token']
end

#load_oauthObject



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/plataforma_social/facebook.rb', line 114

def load_oauth
  if params[:callback_url].present?
    callback_url = params[:callback_url]
  elsif request.present?
    callback_url = "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
  else
    callback_url = PlataformaSocial.facebook_callback_url.to_s
  end

  uri = URI.parse(callback_url)

  callback_url = if uri && uri.scheme.present?
    uri.query = [
      uri.query,
      "gm_referral_code=#{URI.encode(params[:gm_referral_code] || '')}",
      "utm_source=#{URI.encode(params[:utm_source] || '')}",
      "source=#{URI.encode(params[:utm_source] || '')}",
      "campaign=#{URI.encode(params[:utm_campaign] || '')}",
      "utm_campaign=#{URI.encode(params[:utm_campaign] || '')}",
      "medium=#{URI.encode(params[:utm_medium] || '')}",
      "utm_medium=#{URI.encode(params[:utm_medium] || '')}"
    ].compact.join('&')

    uri.to_s
  else
    nil
  end

  @oauth = Koala::Facebook::OAuth.new(PlataformaSocial.facebook_app_id, PlataformaSocial.facebook_app_secret, callback_url)
end

#load_user_data(options = {}) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/plataforma_social/facebook.rb', line 57

def load_user_data options = {}
  settings = {
    referral_code: params[:gm_referral_code],
    source: params[:utm_source],
    utm: {
      source: params[:utm_source],
      medium: params[:utm_medium],
      campaign: params[:utm_campaign]
    },
    referrer: request.referer,
    signed_request: params[:signed_request]
  }.merge options

  facebook_data          = facebook_user_data.try(:symbolize_keys)
  plataforma_social_data = plataforma_social_user_data(settings).try(:symbolize_keys)

  @user_data = { :facebook => facebook_data, :plataforma_social => plataforma_social_data }
end

#parse_facebook_signed_requestObject



109
110
111
112
# File 'lib/plataforma_social/facebook.rb', line 109

def parse_facebook_signed_request
  load_oauth
  @oauth.parse_signed_request params[:signed_request] if params[:signed_request].present?
end

#plataforma_social_user_data(options = {}) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/plataforma_social/facebook.rb', line 76

def plataforma_social_user_data options = {}
  settings = {
    referral_code: params[:gm_referral_code],
    source: params[:utm_source],
    utm: {
      source: params[:utm_source],
      medium: params[:utm_medium],
      campaign: params[:utm_campaign]
    },
    referrer: request.referer,
    signed_request: params[:signed_request]
  }.merge options

  if settings[:signed_request]
    header_params = {
      'User-Agent' => request.env['HTTP_USER_AGENT'],
      'Referer' => request.referer
    }
    response = Request.post("#{PlataformaSocial.domains('login')}/register", settings, header_params)

    data = {}
    data[:reference] = response['id'] if response.present? && response['id']

    data
  end
end