Class: Koala::Facebook::OAuth

Inherits:
Object
  • Object
show all
Defined in:
lib/koala.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app_id, app_secret, oauth_callback_url = nil) ⇒ OAuth

Returns a new instance of OAuth.



182
183
184
185
186
# File 'lib/koala.rb', line 182

def initialize(app_id, app_secret, oauth_callback_url = nil)
  @app_id = app_id
  @app_secret = app_secret
  @oauth_callback_url = oauth_callback_url 
end

Instance Attribute Details

#app_idObject

Returns the value of attribute app_id.



181
182
183
# File 'lib/koala.rb', line 181

def app_id
  @app_id
end

#app_secretObject

Returns the value of attribute app_secret.



181
182
183
# File 'lib/koala.rb', line 181

def app_secret
  @app_secret
end

#oauth_callback_urlObject

Returns the value of attribute oauth_callback_url.



181
182
183
# File 'lib/koala.rb', line 181

def oauth_callback_url
  @oauth_callback_url
end

Instance Method Details

#fetch_token_string(code) ⇒ Object



250
251
252
253
254
255
256
257
# File 'lib/koala.rb', line 250

def fetch_token_string(code)
  Koala.make_request("oauth/access_token", {
    :client_id => @app_id, 
    :redirect_uri => @oauth_callback_url, 
    :client_secret => @app_secret, 
    :code => code
  }, "get")
end

#get_access_token(code) ⇒ Object

Raises:



259
260
261
262
263
264
265
266
# File 'lib/koala.rb', line 259

def get_access_token(code)
  result = fetch_token_string(code)
  
  # if we have an error, parse the error JSON and raise an error
  raise GraphAPIError.new((JSON.parse(result)["error"] rescue nil) || {}) if result =~ /error/
  # otherwise, parse the access token
  parse_access_token(result)
end


188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/koala.rb', line 188

def get_user_from_cookie(cookie_hash)
  # Parses the cookie set by the official Facebook JavaScript SDK.
  # 
  # cookies should be a dictionary-like object mapping cookie names to
  # cookie values.
  # 
  # If the user is logged in via Facebook, we return a dictionary with the
  # keys "uid" and "access_token". The former is the user's Facebook ID,
  # and the latter can be used to make authenticated requests to the Graph API.
  # If the user is not logged in, we return None.
  # 
  # Download the official Facebook JavaScript SDK at
  # http://github.com/facebook/connect-js/. Read more about Facebook
  # authentication at http://developers.facebook.com/docs/authentication/.

  if fb_cookie = cookie_hash["fbs_" + @app_id.to_s]
    # remove the opening/closing quote
    fb_cookie = fb_cookie.gsub(/\"/, "")

    # since we no longer get individual cookies, we have to separate out the components ourselves
    components = {}
    fb_cookie.split("&").map {|param| param = param.split("="); components[param[0]] = param[1]}

    # generate the signature and make sure it matches what we expect
    auth_string = components.keys.sort.collect {|a| a == "sig" ? nil : "#{a}=#{components[a]}"}.reject {|a| a.nil?}.join("")
    sig = Digest::MD5.hexdigest(auth_string + @app_secret)          
    sig == components["sig"] && (components["expires"] == "0" || Time.now.to_i < components["expires"].to_i) ? components : nil
  end
end

#parse_access_token(response_text) ⇒ Object



242
243
244
245
246
247
248
# File 'lib/koala.rb', line 242

def parse_access_token(response_text)
  components = response_text.split("&").inject({}) do |hash, bit|
    key, value = bit.split("=")
    hash.merge!(key => value)
  end
  components 
end

#url_for_access_token(code, options = {}) ⇒ Object

Raises:

  • (ArgumentError)


231
232
233
234
235
236
237
238
239
240
# File 'lib/koala.rb', line 231

def url_for_access_token(code, options = {})
  # Creates the URL for the token corresponding to a given code generated by Facebook
  if options.is_a?(String) # changing the arguments
    puts "Deprecation warning: url_for_access_token now takes an options hash as the second argument; pass the callback as :callback."
    options = {:callback => options}
  end
  callback = options[:callback] || @oauth_callback_url
  raise ArgumentError, "url_for_access_token must get a callback either from the OAuth object or in the parameters!" unless callback
  "https://#{GRAPH_SERVER}/oauth/access_token?client_id=#{@app_id}&redirect_uri=#{callback}&client_secret=#{@app_secret}&code=#{code}"
end

#url_for_oauth_code(options = {}) ⇒ Object

Raises:

  • (ArgumentError)


219
220
221
222
223
224
225
226
227
228
229
# File 'lib/koala.rb', line 219

def url_for_oauth_code(options = {})
  # for permissions, see http://developers.facebook.com/docs/authentication/permissions
  permissions = options[:permissions]
  scope = permissions ? "&scope=#{permissions.is_a?(Array) ? permissions.join(",") : permissions}" : ""

  callback = options[:callback] || @oauth_callback_url
  raise ArgumentError, "url_for_oauth_code must get a callback either from the OAuth object or in the options!" unless callback

  # Creates the URL for oauth authorization for a given callback and optional set of permissions
  "https://#{GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{callback}#{scope}"    
end