user984621
user984621

Reputation: 48503

Rails + OmniAuth Facebook: how to obtain Access Token?

I am trying to fetch the list of friends from Facebook. Sign in through Facebook is not a problem, but the problem is to fetch person's friends - because of access token.

puts request.env["omniauth.auth"].inspect
puts '==='
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
@fb_user = FbGraph::User.fetch(@user.uid).friends
puts @fb_user.inspect

The problem is on the #4 line - in this case I am getting error

OAuthException :: An access token is required to request this resource.

When I put there something like this:

@fb_user = FbGraph::User.fetch(request.env["omniauth.auth"].credentials.token).friends

I'll get

OAuthException :: (#803) Some of the aliases you requested do not exist: PRINTED OUT TOKEN

What's the proper way to obtain the access token?

EDIT: Current flow

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
    @fb_user = FbGraph::User.fetch(request.env["omniauth.auth"].credentials.token).friends
    if !@user
      flash[:error] = 'This email address is already used in the system.'
      redirect_to :back
    elsif @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

In User model:

  def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
    data = access_token.extra.raw_info
    if user = User.where(:provider => 'facebook', :uid => data.id).first
      user
    elsif user = User.where('email = ? AND provider IS NULL', data.email).first
      return false
    else
      ...saving data...
    end
    return user if user
  end

Upvotes: 3

Views: 5961

Answers (1)

akells
akells

Reputation: 41

You can get an access token for test purposes via the Facebook Graph API Explorer. Make sure you select the proper fields that you want access to, and click "get access token". A more permanent solution is to register your app with Facebook so that you will be able to continually make requests without the token dying.

You should look into the Facebook OAuth dialogue.

I'm assuming you're trying to use the OAuth2 strategy instead of the Javascript SDK. Make sure you have set up a callback url like so:

client.redirect_uri = "http://your.client.com/facebook/callback"

In the controller that handles your callback, you should do something like this:

client.authorization_code = params[:code] 
access_token = client.access_token! :client_auth_body 
FbGraph::User.me(access_token).fetch

Make sure you've let fb_graph know what your app's id and secret are. You should look into this stackoverflow to keep your apps info safe.

I'll also plug the koala gem

Upvotes: 4

Related Questions