94 lines
2.2 KiB
Ruby
94 lines
2.2 KiB
Ruby
class FacebookController < ApplicationController
|
|
skip_before_filter :check_xhr, only: [:frame, :complete]
|
|
layout false
|
|
|
|
def frame
|
|
redirect_to oauth_consumer.url_for_oauth_code(:permissions => "email")
|
|
end
|
|
|
|
def complete
|
|
consumer = oauth_consumer
|
|
token = consumer.get_access_token(params[:code])
|
|
|
|
graph = Koala::Facebook::API.new(token)
|
|
me = graph.get_object("me")
|
|
|
|
email = me["email"]
|
|
verified = me["verified"]
|
|
|
|
name = me["name"]
|
|
username = User.suggest_username(me["username"])
|
|
|
|
verified = me["verified"]
|
|
|
|
# non verified accounts are just trouble
|
|
unless verified
|
|
render text: "Your account must be verified with facebook, before authenticating with facebook"
|
|
return
|
|
end
|
|
|
|
session[:authentication] = {
|
|
facebook: {
|
|
facebook_user_id: me["id"],
|
|
link: me["link"],
|
|
username: me["username"],
|
|
first_name: me["first_name"],
|
|
last_name: me["last_name"],
|
|
email: me["email"],
|
|
gender: me["gender"],
|
|
name: me["name"]
|
|
},
|
|
email: me["email"],
|
|
email_valid: true
|
|
}
|
|
|
|
user_info = FacebookUserInfo.where(:facebook_user_id => me["id"]).first
|
|
|
|
@data = {
|
|
username: username,
|
|
name: name,
|
|
email: email,
|
|
auth_provider: "Facebook",
|
|
email_valid: true
|
|
}
|
|
|
|
if user_info
|
|
user = user_info.user
|
|
if user
|
|
unless user.active
|
|
user.active = true
|
|
user.save
|
|
end
|
|
log_on_user(user)
|
|
@data[:authenticated] = true
|
|
end
|
|
else
|
|
user = User.where(email: me["email"]).first
|
|
if user
|
|
FacebookUserInfo.create!(session[:authentication][:facebook].merge(user_id: user.id))
|
|
unless user.active
|
|
user.active = true
|
|
user.save
|
|
end
|
|
log_on_user(user)
|
|
@data[:authenticated] = true
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
protected
|
|
|
|
def oauth_consumer
|
|
require 'koala'
|
|
|
|
host = request.host
|
|
host = "#{host}:#{request.port}" if request.port != 80
|
|
callback_url = "http://#{host}/facebook/complete"
|
|
|
|
oauth = Koala::Facebook::OAuth.new(SiteSetting.facebook_app_id, SiteSetting.facebook_app_secret, callback_url)
|
|
end
|
|
|
|
end
|