Skip to content

Commit

Permalink
Added support for facebook signed cookies.
Browse files Browse the repository at this point in the history
  • Loading branch information
james2m committed Dec 13, 2011
1 parent b2957c0 commit 277aead
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 51 deletions.
16 changes: 8 additions & 8 deletions lib/authlogic_facebook_shim/adapters/koala_adapter.rb
Expand Up @@ -4,15 +4,13 @@ module KoalaAdapter

def facebook_session
@facebook_session ||= begin
if controller.cookies.has_key?("fbs_#{facebook_app_id}")
oauth = Koala::Facebook::OAuth.new(facebook_app_id, facebook_secret_key)
if oauth.respond_to?(:get_user_info_from_cookie)
user_info = oauth.get_user_info_from_cookie(controller.cookies)
else
user_info = oauth.get_user_from_cookie(controller.cookies)
end
OpenStruct.new( user_info )
oauth = Koala::Facebook::OAuth.new(facebook_app_id, facebook_secret_key)
if oauth.respond_to?(:get_user_info_from_cookie)
user_info = oauth.get_user_info_from_cookie(controller.cookies)
else
user_info = oauth.get_user_from_cookie(controller.cookies)
end
OpenStruct.new( user_info ) if user_info
end
end

Expand All @@ -22,10 +20,12 @@ def facebook_session?

def facebook_user
@facebook_user ||= begin

facebook_graph = Koala::Facebook::GraphAPI.new(facebook_session.access_token)
user = facebook_graph.get_object('me')
user[:uid] = user.delete('id')
OpenStruct.new( user )

end if facebook_session?
end

Expand Down
101 changes: 73 additions & 28 deletions test/units/adapters/koala_adapter_test.rb
Expand Up @@ -8,24 +8,32 @@

@user_info = {
'session_key' => 'mocksessionkey',
'expires' => '0',
'uid' => 'mockuid',
'sig' => 'cbd80b97f124bf392f76e2ee61168990',
'secret' => 'mocksecret',
'expires' => '0',
'uid' => 'mockuid',
'access_token' => 'mockaccesstoken'
}

@mock_cookies = MockCookieJar.new
@mock_cookies['fbs_mockappid'] = {
:value => 'access_token=mockaccesstoken&expires=0&secret=mocksecret&session_key=mocksessionkey&sig=cbd80b97f124bf392f76e2ee61168990&uid=mockuid'
@signed_user_info = {
"algorithm" => "HMAC-SHA256",
"code" => "mockcode",
"issued_at" => 1323717457,
"expires" => "4880",
"user_id" => "mockuserid",
"access_token" => "mockaccesstoken",
}

@mock_cookies = MockCookieJar.new
override controller, :cookies => @mock_cookies

@session = UserSession.new
override @session, :facebook_app_id => 'mockappid'
override @session, :facebook_api_key => 'mockapikey'
override @session, :facebook_secret_key => 'mocksecret'

@oauth = MiniTest::Mock.new
override Koala::Facebook::OAuth, :new => @oauth
end

describe "setup - for my own sanity" do
Expand Down Expand Up @@ -54,9 +62,14 @@

describe "facebook_session" do

describe "with a valid facebook cookie" do
describe "with an unsigned facebook cookie" do

describe "and koala support for get_user_info_from_cookie" do

before do
@oauth.expect :respond_to?, :true, [:get_user_info_from_cookie]
@oauth.expect :get_user_info_from_cookie, @user_info, [@mock_cookies]
end

it "should return a session_key" do
@session.facebook_session.session_key.must_equal 'mocksessionkey'
Expand Down Expand Up @@ -97,11 +110,39 @@

end

describe "with an signed facebook cookie" do

describe "and koala support for get_user_info_from_cookie" do

before do
@oauth.expect :respond_to?, :true, [:get_user_info_from_cookie]
@oauth.expect :get_user_info_from_cookie, @signed_user_info, [@mock_cookies]
end

it "should return a code" do
@session.facebook_session.code.must_equal 'mockcode'
end

it "should return a user_id" do
@session.facebook_session.user_id.must_equal 'mockuserid'
end

it "should return an access_token" do
@session.facebook_session.access_token.must_equal 'mockaccesstoken'
end

end

end

describe "with no valid facebook cookie" do

before do
@oauth.expect :respond_to?, :true, [:get_user_info_from_cookie]
@oauth.expect :get_user_info_from_cookie, nil, [@mock_cookies]
end

it "should return nil" do
def @session.facebook_app_id; nil end

@session.facebook_session.must_be_nil
end

Expand All @@ -112,6 +153,11 @@ def @session.facebook_app_id; nil end
describe "facebook_session?" do

describe "with a valid facebook session" do

before do
@oauth.expect :respond_to?, :true, [:get_user_info_from_cookie]
override @oauth, :get_user_info_from_cookie => @signed_user_info
end

it "should be true" do
@session.facebook_session?.must_equal true
Expand All @@ -120,9 +166,12 @@ def @session.facebook_app_id; nil end
end

describe "without a valid facebook session" do

before do
override @oauth, :get_user_info_from_cookie => nil
end

it "should be false" do
override @session, :facebook_app_id => nil
@session.facebook_session?.must_equal false
end

Expand All @@ -135,30 +184,24 @@ def @session.facebook_app_id; nil end
describe "with a valid facebook session" do

before do
@user = {
"id" => "mockid",
"name" => "Full name",
"first_name" => "First name",
"last_name" => "Last name"
}

override @session, :facebook_session? => true

@graph_api = MiniTest::Mock.new
@graph_api.expect :get_object, @user, ['me']

override Koala::Facebook::GraphAPI, :new => @graph_api
end

it "should initialize the graph api" do

facebook_session = MiniTest::Mock.new
access_token = MiniTest::Mock.new
facebook_session.expect :access_token, access_token

override @session, :facebook_session => facebook_session

expect Koala::Facebook::GraphAPI, :new, :with => [access_token], :return => @graph_api
@session.facebook_user
override @session, :facebook_session? => true

@user = {
"id" => "mockid",
"name" => "Full name",
"first_name" => "First name",
"last_name" => "Last name"
}

@graph_api.expect :get_object, @user, ['me']
end

it "should return an OpenStruct" do
Expand All @@ -174,14 +217,16 @@ def @session.facebook_app_id; nil end
it "should return the facebook id as uid" do
@session.facebook_user.uid.must_equal 'mockid'
end

end

describe "with no valid facebook session" do

it "should return nil" do
before do
override @session, :facebook_session? => false
end

it "should return nil" do
@session.facebook_user.must_be_nil
end

Expand Down
21 changes: 6 additions & 15 deletions test/units/session/facebook_test.rb
Expand Up @@ -5,11 +5,6 @@

before do
activate_authlogic

@mock_cookies = MockCookieJar.new
@mock_cookies['fbs_mockappid'] = {:value => 'access_token=mockaccesstoken&expires=0&secret=mocksecret&session_key=mocksessionkey&sig=cbd80b97f124bf392f76e2ee61168990&uid=mockuid'}

override controller, :cookies => @mock_cookies
end

describe "setup - for my own sanity" do
Expand All @@ -23,10 +18,6 @@
@session.controller.must_equal controller
end

it "should set the cookies" do
@session.controller.cookies.must_equal @mock_cookies
end

end

describe "config accessors" do
Expand Down Expand Up @@ -219,25 +210,25 @@
end
end

describe "when authenticating_with_unauthorized_record? is false" do
describe "when authenticating_with_unauthorized_record? is true" do

before do
override @session, :facebook_session? => true
override @session, :authenticating_with_unauthorized_record? => true
end

it "should not attempt to validate with facebook" do
override @session, :authenticating_with_unauthorized_record? => false
override @session, :validate_by_facebook => lambda { raise Override::ExpectationError.new('to not be called', 'called') }

@session.save.must_equal false
end

it "should return false for logged_in_with_facebook?" do
override @session, :authenticating_with_unauthorized_record? => true

@session.save.must_equal false
@session.logged_in_with_facebook?.must_be_nil
end

it "should not set attempted record" do
override @session, :authenticating_with_unauthorized_record? => true

@session.save.must_equal false
@session.attempted_record.must_be_nil
end
Expand Down

0 comments on commit 277aead

Please sign in to comment.