facebook_session 0.0.5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/facebook_session/decodeable_struct.rb +17 -0
- data/lib/facebook_session/helper.rb +4 -8
- data/lib/facebook_session/message_decoder.rb +56 -0
- data/lib/facebook_session/railtie.rb +10 -0
- data/lib/facebook_session/session.rb +1 -17
- data/lib/facebook_session/signed_request.rb +3 -18
- data/lib/facebook_session/version.rb +1 -1
- data/lib/facebook_session.rb +29 -30
- data/spec/facebook_session_spec.rb +76 -0
- data/spec/helper_spec.rb +85 -0
- data/spec/message_decoder_spec.rb +25 -0
- data/spec/session_spec.rb +24 -0
- data/spec/signed_request_spec.rb +29 -0
- data/spec/spec_helper.rb +7 -0
- metadata +36 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b5d4f0754ffc4ec193b5d4361c452ad0d4cbb6a
|
4
|
+
data.tar.gz: c6b7aab9c0612dd22cc62e349ca7bf3445061a42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4145e761156a6e411a39eb90fcc5a8af36834e84740d02c61b5503f67b59e5db8f64c18536a29d362757865395ac265fc0dd8baa03f392d571f3a8134c127251
|
7
|
+
data.tar.gz: 63a7742caf13f59f3eec877707e8e40c29912ca79ab2ba3cf3af2591878aa60730c7b1d57dc16070b845d72f2b82c3222c8d70c09d04a2423076d917b909186e
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module FacebookSession
|
2
|
+
class DecodeableStruct
|
3
|
+
class << self
|
4
|
+
def decode(message)
|
5
|
+
self.new(FacebookSession.message_decoder.decode(message))
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(data={})
|
10
|
+
data.each do |key, value|
|
11
|
+
if self.respond_to?("#{key.to_s}=".to_sym)
|
12
|
+
self.send("#{key.to_s}=".to_sym, value)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -2,10 +2,8 @@ module FacebookSession
|
|
2
2
|
module Helper
|
3
3
|
|
4
4
|
def facebook_session
|
5
|
-
|
6
|
-
|
7
|
-
if facebook_cookie = cookies["fbsr_#{FacebookSession.application_id}"]
|
8
|
-
@facebook_session = FacebookSession::Session.parse_cookie(facebook_cookie)
|
5
|
+
if message = cookies["fbsr_#{FacebookSession.application_id}"]
|
6
|
+
@facebook_session ||= FacebookSession::Session.decode(message)
|
9
7
|
end
|
10
8
|
end
|
11
9
|
|
@@ -14,10 +12,8 @@ module FacebookSession
|
|
14
12
|
end
|
15
13
|
|
16
14
|
def facebook_signed_request
|
17
|
-
|
18
|
-
|
19
|
-
if facebook_signed_request = params[:signed_request]
|
20
|
-
@facebook_signed_request = FacebookSession::SignedRequest.parse_request(facebook_signed_request)
|
15
|
+
if message = params[:signed_request]
|
16
|
+
@facebook_signed_request ||= FacebookSession::SignedRequest.decode(message)
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module FacebookSession
|
4
|
+
class MessageDecoder
|
5
|
+
def initialize(secret)
|
6
|
+
@secret = secret
|
7
|
+
end
|
8
|
+
|
9
|
+
def decode(string)
|
10
|
+
encoded_digest, payload = string.split('.')
|
11
|
+
digest = decode_base64(encoded_digest)
|
12
|
+
|
13
|
+
if valid_digest?(payload, digest)
|
14
|
+
parse_payload(payload)
|
15
|
+
else
|
16
|
+
raise FacebookSession::InvalidSignature
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def decode_base64(str)
|
23
|
+
str += '=' while str.length % 4 != 0 # Pad string with =
|
24
|
+
Base64.urlsafe_decode64(str)
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_payload(payload)
|
28
|
+
parsed_payload = JSON.parse(decode_base64(payload))
|
29
|
+
parsed_payload.symbolize_keys!
|
30
|
+
parsed_payload
|
31
|
+
end
|
32
|
+
|
33
|
+
def secure_compare(a, b)
|
34
|
+
return false unless a.bytesize == b.bytesize
|
35
|
+
|
36
|
+
l = a.unpack "C#{a.bytesize}"
|
37
|
+
|
38
|
+
res = 0
|
39
|
+
b.each_byte { |byte| res |= byte ^ l.shift }
|
40
|
+
res == 0
|
41
|
+
end
|
42
|
+
|
43
|
+
def generate_digest(data)
|
44
|
+
require 'openssl' unless defined?(OpenSSL)
|
45
|
+
OpenSSL::HMAC.digest(
|
46
|
+
OpenSSL::Digest.new('sha256'),
|
47
|
+
@secret,
|
48
|
+
data
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def valid_digest?(data, digest)
|
53
|
+
data.present? && digest.present? && secure_compare(digest, generate_digest(data))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -1,21 +1,5 @@
|
|
1
1
|
module FacebookSession
|
2
|
-
class Session
|
2
|
+
class Session < DecodeableStruct
|
3
3
|
attr_accessor :user_id, :oauth_token, :algorithm, :issued_at
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def parse_cookie(cookie)
|
7
|
-
if session_data = FacebookSession.decode_payload(cookie)
|
8
|
-
self.new(session_data)
|
9
|
-
else
|
10
|
-
nil
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def initialize(session_data={})
|
16
|
-
session_data.each do |key, value|
|
17
|
-
self.send("#{key.to_s}=".to_sym, value) if self.respond_to?("#{key.to_s}=".to_sym)
|
18
|
-
end
|
19
|
-
end
|
20
4
|
end
|
21
5
|
end
|
@@ -1,21 +1,6 @@
|
|
1
1
|
module FacebookSession
|
2
|
-
class SignedRequest
|
3
|
-
attr_accessor :
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def parse_request(request)
|
7
|
-
if request_data = FacebookSession.decode_payload(request)
|
8
|
-
self.new(request_data)
|
9
|
-
else
|
10
|
-
nil
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def initialize(request_data={})
|
16
|
-
request_data.each do |key, value|
|
17
|
-
self.send("#{key.to_s}=".to_sym, value) if self.respond_to?("#{key.to_s}=".to_sym)
|
18
|
-
end
|
19
|
-
end
|
2
|
+
class SignedRequest < DecodeableStruct
|
3
|
+
attr_accessor :user_id, :oauth_token, :algorithm, :issued_at
|
4
|
+
attr_accessor :code, :user, :expires, :app_data, :page
|
20
5
|
end
|
21
6
|
end
|
data/lib/facebook_session.rb
CHANGED
@@ -1,60 +1,59 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'facebook_session/decodeable_struct')
|
1
4
|
require File.join(File.dirname(__FILE__), 'facebook_session/helper')
|
5
|
+
require File.join(File.dirname(__FILE__), 'facebook_session/message_decoder')
|
2
6
|
require File.join(File.dirname(__FILE__), 'facebook_session/session')
|
7
|
+
require File.join(File.dirname(__FILE__), 'facebook_session/railtie')
|
3
8
|
require File.join(File.dirname(__FILE__), 'facebook_session/signed_request')
|
4
9
|
|
5
10
|
module FacebookSession
|
11
|
+
class InvalidSignature < StandardError; end
|
12
|
+
class NotConfiguredError < StandardError; end
|
13
|
+
|
6
14
|
class << self
|
7
15
|
|
8
|
-
def
|
9
|
-
@@config
|
16
|
+
def clear_config!
|
17
|
+
@@config = nil
|
10
18
|
end
|
11
19
|
|
12
20
|
def config?
|
13
|
-
|
21
|
+
config[:application_id] && config[:application_secret] ? true : false
|
14
22
|
end
|
15
23
|
|
16
24
|
def configure(options={})
|
17
25
|
options.each do |key, val|
|
18
|
-
|
26
|
+
config[key.to_sym] = val
|
19
27
|
end
|
20
|
-
|
28
|
+
config
|
21
29
|
end
|
22
30
|
|
23
31
|
def application_id
|
24
|
-
|
32
|
+
if config[:application_id].kind_of?(Proc)
|
33
|
+
config[:application_id].call
|
34
|
+
else
|
35
|
+
config[:application_id]
|
36
|
+
end
|
25
37
|
end
|
26
38
|
|
27
39
|
def application_secret
|
28
|
-
|
40
|
+
if config[:application_secret].kind_of?(Proc)
|
41
|
+
config[:application_secret].call
|
42
|
+
else
|
43
|
+
config[:application_secret]
|
44
|
+
end
|
29
45
|
end
|
30
46
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
Base64.decode64(encoded_string)
|
47
|
+
def message_decoder
|
48
|
+
raise NotConfiguredError unless config?
|
49
|
+
FacebookSession::MessageDecoder.new(application_secret)
|
35
50
|
end
|
36
51
|
|
37
|
-
|
38
|
-
encoded_sig, payload = string.split('.')
|
39
|
-
sig = base64_url_decode(encoded_sig)
|
40
|
-
decoded_payload = JSON.parse(base64_url_decode(payload))
|
41
|
-
decoded_payload.symbolize_keys!
|
42
|
-
|
43
|
-
expected_sig = OpenSSL::HMAC.digest(
|
44
|
-
OpenSSL::Digest.new('sha256'),
|
45
|
-
FacebookSession.application_secret,
|
46
|
-
payload
|
47
|
-
)
|
52
|
+
private
|
48
53
|
|
49
|
-
|
50
|
-
|
51
|
-
else
|
52
|
-
nil
|
53
|
-
end
|
54
|
+
def config
|
55
|
+
@@config ||= {}
|
54
56
|
end
|
55
|
-
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
59
|
-
ActionView::Base.send :include, FacebookSession::Helper
|
60
|
-
ActionController::Base.send :include, FacebookSession::Helper
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FacebookSession do
|
4
|
+
before(:each) do
|
5
|
+
FacebookSession.clear_config!
|
6
|
+
end
|
7
|
+
|
8
|
+
describe ".config?" do
|
9
|
+
subject { FacebookSession.config? }
|
10
|
+
|
11
|
+
context "when no config is set" do
|
12
|
+
it { is_expected.to eq(false) }
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when one option is missing" do
|
16
|
+
before { FacebookSession.configure(application_id: "foo") }
|
17
|
+
it { is_expected.to eq(false) }
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when both options are set" do
|
21
|
+
before { FacebookSession.configure(application_id: "foo", application_secret: "bar") }
|
22
|
+
it { is_expected.to eq(true) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe ".application_id" do
|
27
|
+
subject { FacebookSession.application_id }
|
28
|
+
|
29
|
+
context "when unconfigured" do
|
30
|
+
it { is_expected.to eq(nil) }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when configured with a string" do
|
34
|
+
before { FacebookSession.configure(application_id: "foo") }
|
35
|
+
it { is_expected.to eq("foo") }
|
36
|
+
end
|
37
|
+
|
38
|
+
context "when configured with a proc" do
|
39
|
+
before { FacebookSession.configure(application_id: -> { "foo" }) }
|
40
|
+
it { is_expected.to eq("foo") }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe ".application_secret" do
|
45
|
+
subject { FacebookSession.application_secret }
|
46
|
+
|
47
|
+
context "when unconfigured" do
|
48
|
+
it { is_expected.to eq(nil) }
|
49
|
+
end
|
50
|
+
|
51
|
+
context "when configured with a string" do
|
52
|
+
before { FacebookSession.configure(application_secret: "foo") }
|
53
|
+
it { is_expected.to eq("foo") }
|
54
|
+
end
|
55
|
+
|
56
|
+
context "when configured with a proc" do
|
57
|
+
before { FacebookSession.configure(application_secret: -> { "foo" }) }
|
58
|
+
it { is_expected.to eq("foo") }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe ".message_decoder" do
|
63
|
+
subject { FacebookSession.message_decoder }
|
64
|
+
|
65
|
+
context "without configuration" do
|
66
|
+
it "should raise an error" do
|
67
|
+
expect { subject }.to raise_error(FacebookSession::NotConfiguredError)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "with configuration" do
|
72
|
+
before { FacebookSession.configure(application_id: "foo", application_secret: "bar") }
|
73
|
+
it { is_expected.to be_a(FacebookSession::MessageDecoder) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/spec/helper_spec.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class TestController
|
4
|
+
include FacebookSession::Helper
|
5
|
+
def initialize(options = {})
|
6
|
+
@fb_session = options[:fb_session]
|
7
|
+
@signed_request = options[:signed_request]
|
8
|
+
end
|
9
|
+
|
10
|
+
def cookies
|
11
|
+
{ "fbsr_foo" => @fb_session }
|
12
|
+
end
|
13
|
+
|
14
|
+
def params
|
15
|
+
{ signed_request: @signed_request }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe FacebookSession::Helper do
|
20
|
+
before(:all) { FacebookSession.configure(application_id: "foo", application_secret: "bar") }
|
21
|
+
|
22
|
+
let(:json) { '{"user_id": "123", "oauth_token": "abc", "algorithm": "sha256", "issued_at": "2014"}' }
|
23
|
+
let(:payload) { Base64.urlsafe_encode64(json) }
|
24
|
+
let(:digest) { Base64.urlsafe_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), "bar", payload)) }
|
25
|
+
let(:message) { "#{digest}.#{payload}" }
|
26
|
+
let(:controller) { TestController.new }
|
27
|
+
|
28
|
+
describe "#facebook_session" do
|
29
|
+
subject { controller.facebook_session }
|
30
|
+
|
31
|
+
context "without session data" do
|
32
|
+
it { is_expected.to eq(nil) }
|
33
|
+
end
|
34
|
+
|
35
|
+
context "with session data" do
|
36
|
+
let(:controller) { TestController.new(fb_session: message) }
|
37
|
+
it { is_expected.to be_a(FacebookSession::Session) }
|
38
|
+
it "should decode the message" do
|
39
|
+
expect(subject.user_id).to eq("123")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#facebook_session?" do
|
45
|
+
subject { controller.facebook_session? }
|
46
|
+
|
47
|
+
context "without session data" do
|
48
|
+
it { is_expected.to eq(false) }
|
49
|
+
end
|
50
|
+
|
51
|
+
context "with session data" do
|
52
|
+
let(:controller) { TestController.new(fb_session: message) }
|
53
|
+
it { is_expected.to eq(true) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#facebook_signed_request" do
|
58
|
+
subject { controller.facebook_signed_request }
|
59
|
+
|
60
|
+
context "without a signed request" do
|
61
|
+
it { is_expected.to eq(nil) }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "with a signed request" do
|
65
|
+
let(:controller) { TestController.new(signed_request: message) }
|
66
|
+
it { is_expected.to be_a(FacebookSession::SignedRequest) }
|
67
|
+
it "should decode the message" do
|
68
|
+
expect(subject.user_id).to eq("123")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#facebook_signed_request?" do
|
74
|
+
subject { controller.facebook_signed_request? }
|
75
|
+
|
76
|
+
context "without a signed request" do
|
77
|
+
it { is_expected.to eq(false) }
|
78
|
+
end
|
79
|
+
|
80
|
+
context "with a signed request" do
|
81
|
+
let(:controller) { TestController.new(signed_request: message) }
|
82
|
+
it { is_expected.to eq(true) }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FacebookSession::MessageDecoder do
|
4
|
+
let(:secret) { "topsecret" }
|
5
|
+
let(:verifier) { FacebookSession::MessageDecoder.new(secret) }
|
6
|
+
let(:json) { '{"foo": "bar"}' }
|
7
|
+
let(:payload) { Base64.urlsafe_encode64(json).gsub(/[=]+$/, '') }
|
8
|
+
let(:digest) { Base64.urlsafe_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), secret, payload)).gsub(/[=]+$/, '') }
|
9
|
+
let(:message) { "#{digest}.#{payload}" }
|
10
|
+
|
11
|
+
describe "#decode" do
|
12
|
+
subject { verifier.decode(message) }
|
13
|
+
|
14
|
+
context "with valid data" do
|
15
|
+
it { is_expected.to eq({foo: "bar"}) }
|
16
|
+
end
|
17
|
+
|
18
|
+
context "with invalid digest" do
|
19
|
+
let(:digest) { "1639a467ae544a4a9b4a5623fe56a2f93276087b" }
|
20
|
+
it "should raise an error" do
|
21
|
+
expect { subject }.to raise_error(FacebookSession::InvalidSignature)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FacebookSession::Session do
|
4
|
+
before(:all) { FacebookSession.configure(application_id: "foo", application_secret: "bar") }
|
5
|
+
|
6
|
+
let(:json) { '{"user_id": "123", "oauth_token": "abc", "algorithm": "sha256", "issued_at": "2014"}' }
|
7
|
+
let(:payload) { Base64.urlsafe_encode64(json) }
|
8
|
+
let(:digest) { Base64.urlsafe_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), "bar", payload)) }
|
9
|
+
let(:message) { "#{digest}.#{payload}" }
|
10
|
+
|
11
|
+
describe ".decode" do
|
12
|
+
subject { FacebookSession::Session.decode(message) }
|
13
|
+
|
14
|
+
context "with a valid message" do
|
15
|
+
it { is_expected.to be_a(FacebookSession::Session) }
|
16
|
+
it "should recieve the data" do
|
17
|
+
expect(subject.user_id).to eq("123")
|
18
|
+
expect(subject.oauth_token).to eq("abc")
|
19
|
+
expect(subject.algorithm).to eq("sha256")
|
20
|
+
expect(subject.issued_at).to eq("2014")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FacebookSession::SignedRequest do
|
4
|
+
before(:all) { FacebookSession.configure(application_id: "foo", application_secret: "bar") }
|
5
|
+
|
6
|
+
let(:json) { '{"user_id": "123", "oauth_token": "abc", "algorithm": "sha256", "issued_at": "2014", "code": "code", "user": "user", "expires": "expires", "app_data": "app_data", "page": "page"}' }
|
7
|
+
let(:payload) { Base64.urlsafe_encode64(json) }
|
8
|
+
let(:digest) { Base64.urlsafe_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), "bar", payload)) }
|
9
|
+
let(:message) { "#{digest}.#{payload}" }
|
10
|
+
|
11
|
+
describe ".decode" do
|
12
|
+
subject { FacebookSession::SignedRequest.decode(message) }
|
13
|
+
|
14
|
+
context "with a valid message" do
|
15
|
+
it { is_expected.to be_a(FacebookSession::SignedRequest) }
|
16
|
+
it "should recieve the data" do
|
17
|
+
expect(subject.user_id).to eq("123")
|
18
|
+
expect(subject.oauth_token).to eq("abc")
|
19
|
+
expect(subject.algorithm).to eq("sha256")
|
20
|
+
expect(subject.issued_at).to eq("2014")
|
21
|
+
expect(subject.code).to eq("code")
|
22
|
+
expect(subject.user).to eq("user")
|
23
|
+
expect(subject.expires).to eq("expires")
|
24
|
+
expect(subject.app_data).to eq("app_data")
|
25
|
+
expect(subject.page).to eq("page")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: facebook_session
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Inge Jørgensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
12
|
-
dependencies:
|
11
|
+
date: 2014-09-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.0
|
13
27
|
description: Rails plugin for simple Facebook session authentication
|
14
28
|
email: inge@manualdesign.no
|
15
29
|
executables: []
|
@@ -17,11 +31,20 @@ extensions: []
|
|
17
31
|
extra_rdoc_files: []
|
18
32
|
files:
|
19
33
|
- lib/facebook_session.rb
|
34
|
+
- lib/facebook_session/decodeable_struct.rb
|
20
35
|
- lib/facebook_session/helper.rb
|
36
|
+
- lib/facebook_session/message_decoder.rb
|
37
|
+
- lib/facebook_session/railtie.rb
|
21
38
|
- lib/facebook_session/session.rb
|
22
39
|
- lib/facebook_session/signed_request.rb
|
23
40
|
- lib/facebook_session/version.rb
|
24
|
-
|
41
|
+
- spec/facebook_session_spec.rb
|
42
|
+
- spec/helper_spec.rb
|
43
|
+
- spec/message_decoder_spec.rb
|
44
|
+
- spec/session_spec.rb
|
45
|
+
- spec/signed_request_spec.rb
|
46
|
+
- spec/spec_helper.rb
|
47
|
+
homepage: https://github.com/manualdesign/facebook_session
|
25
48
|
licenses: []
|
26
49
|
metadata: {}
|
27
50
|
post_install_message:
|
@@ -32,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
32
55
|
requirements:
|
33
56
|
- - ">="
|
34
57
|
- !ruby/object:Gem::Version
|
35
|
-
version:
|
58
|
+
version: 1.9.2
|
36
59
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
60
|
requirements:
|
38
61
|
- - ">="
|
@@ -40,8 +63,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
40
63
|
version: '0'
|
41
64
|
requirements: []
|
42
65
|
rubyforge_project:
|
43
|
-
rubygems_version: 2.
|
66
|
+
rubygems_version: 2.4.1
|
44
67
|
signing_key:
|
45
68
|
specification_version: 4
|
46
69
|
summary: Rails plugin for simple Facebook session authentication
|
47
|
-
test_files:
|
70
|
+
test_files:
|
71
|
+
- spec/facebook_session_spec.rb
|
72
|
+
- spec/helper_spec.rb
|
73
|
+
- spec/message_decoder_spec.rb
|
74
|
+
- spec/session_spec.rb
|
75
|
+
- spec/signed_request_spec.rb
|
76
|
+
- spec/spec_helper.rb
|