I have been trying for days to setup my Omniauth for facebook I don't know what am I doing wrong.
I am not able to get the email of the user. The returned hash only contains the "name" and the "uid" not even "first_name" and "last_name"
devise.rb:
config.omniauth :facebook, "KEY", "SECRET"
omniauth_callbacks_controller.rb:
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
logger.info request.env["omniauth.auth"]
@user = User.from_omniauth(request.env["omniauth.auth"])
sign_in_and_redirect @user
end
end
user.rb:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable, :omniauth_providers => [:facebook]
has_many :authentications
def self.from_omniauth(auth)
logger.info auth
user = where(email: auth.info.email).first
if(user != nil)
user.authentications.where(provider: auth.provider, uid: auth.uid).first_or_create do |l|
user.authentications.create!(user_id: user.id,
provider: auth.provider,
uid: auth.uid)
end
else
user = User.create!(email: auth.info.email,
password: Devise.friendly_token[0,20],
first_name: auth.info.first_name,
last_name: auth.info.last_name)
user.authentications.create!(user_id: user.id,
provider: auth.provider,
uid: auth.uid)
end
user
end
end
registrations_controller.rb:
class RegistrationsController < Devise::RegistrationsController
private
def sign_up_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
def account_update_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :current_password)
end
end
routes.rb:
devise_for :users, :controllers => { registrations: 'registrations', omniauth_callbacks: 'omniauth_callbacks' }
Returned hash:
#<OmniAuth::AuthHash credentials=#<OmniAuth::AuthHash expires=true expires_at=1444504014 token="TOKEN">
extra=#<OmniAuth::AuthHash raw_info=#<OmniAuth::AuthHash id="1506781179612589" name="Ayman Salah">> info=#
<OmniAuth::AuthHash::InfoHash image="http://graph.facebook.com/1506781179612589/picture" name="Ayman Salah"> provider="facebook" uid="1506781179612589">
Make sure you don't put spaces in the info-field request (another answer probably typo'ed this).
You need to specifically ask for email to be returned from the info field hash as it isn't by default.
If you're using Omniauth-Facebook without Devise, set this up in your config/initializers/omniauth.rb file like so:
This info is kind of hidden at the very end of the Configuring section on the omniauth-facebook gem's GitHub readme.
With Devise plus Omniauth, however, you set it in config/initializers/devise.rb like so (no spaces in the string!):
You need to request the permissions. For example, to request
email
,user_birthday
andread_stream
permissions and display the authentication page in a popup window:Please check this Omniauth-facebook if you have any doubts.
I only got to retrieve the email by adding this in devise.rb:
I had the same problem but it turns out it was a different issue, if you use a client side flow make sure to request the scopes you need on your client:
I had the same problem. I made it work updating omniauth and omniauth-facebook gems.