thefacebook 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +6 -0
- data/Rakefile +1 -0
- data/lib/thefacebook.rb +7 -0
- data/lib/thefacebook/base64_extensions.rb +10 -0
- data/lib/thefacebook/signed_request.rb +26 -0
- data/lib/thefacebook/version.rb +3 -0
- data/spec/base64_extensions_test.rb +29 -0
- data/spec/signed_request_test.rb +31 -0
- data/thefacebook.gemspec +24 -0
- metadata +69 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/thefacebook.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'active_support/json'
|
3
|
+
require File.dirname(__FILE__) + '/base64_extensions'
|
4
|
+
|
5
|
+
module Thefacebook
|
6
|
+
|
7
|
+
class SignedRequest
|
8
|
+
def initialize(signed_request, secret)
|
9
|
+
@signed_request = signed_request
|
10
|
+
@signature, @signed_params = signed_request.split('.') if signed_request
|
11
|
+
@secret = secret
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def valid?
|
16
|
+
return false unless [@signature, @signed_params].all? { |str| str.respond_to?(:tr) }
|
17
|
+
expected_signature = OpenSSL::HMAC.digest('SHA256', @secret, @signed_params.tr("-_", "+/"))
|
18
|
+
return expected_signature == Base64.decode64url(@signature)
|
19
|
+
end
|
20
|
+
|
21
|
+
def params
|
22
|
+
ActiveSupport::JSON.decode Base64.decode64url(@signed_params)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
$:.push File.expand_path("../lib")
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'thefacebook/base64_extensions'
|
4
|
+
|
5
|
+
def base64url_compare(str)
|
6
|
+
encoded_str = str.gsub('-','+').gsub('_','/')
|
7
|
+
encoded_str += '=' while !(encoded_str.size % 4).zero?
|
8
|
+
Base64.decode64(encoded_str)
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
describe Base64 do
|
13
|
+
|
14
|
+
it "should give the correct encoding with different lengths" do
|
15
|
+
url = "http://123"
|
16
|
+
Base64.decode64url(url).must_equal base64url_compare(url)
|
17
|
+
url = "http://1234"
|
18
|
+
Base64.decode64url(url).must_equal base64url_compare(url)
|
19
|
+
url = "http://12345"
|
20
|
+
Base64.decode64url(url).must_equal base64url_compare(url)
|
21
|
+
url = "http://123456"
|
22
|
+
Base64.decode64url(url).must_equal base64url_compare(url)
|
23
|
+
url = "http://123457"
|
24
|
+
Base64.decode64url(url).must_equal base64url_compare(url)
|
25
|
+
url = "http://1234578"
|
26
|
+
Base64.decode64url(url).must_equal base64url_compare(url)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
$:.push File.expand_path("../lib")
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'thefacebook/signed_request'
|
4
|
+
|
5
|
+
|
6
|
+
describe Thefacebook::SignedRequest do
|
7
|
+
|
8
|
+
it "should validate a correct signed request" do
|
9
|
+
sr = "vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0"
|
10
|
+
result = Thefacebook::SignedRequest.new(sr,"secret")
|
11
|
+
result.valid?.must_equal true
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should not validate an incorrect signed request" do
|
15
|
+
sr = "vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0"
|
16
|
+
result = Thefacebook::SignedRequest.new(sr,"secret_false")
|
17
|
+
result.valid?.must_equal false
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not validate an empty signed request" do
|
21
|
+
result = Thefacebook::SignedRequest.new(nil,"secret_false")
|
22
|
+
result.valid?.must_equal false
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should decode the encoded params" do
|
26
|
+
sr = "vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0"
|
27
|
+
result = Thefacebook::SignedRequest.new(sr,"secret")
|
28
|
+
result.params["0"].must_equal "payload"
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/thefacebook.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "thefacebook/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "thefacebook"
|
7
|
+
s.version = Thefacebook::VERSION
|
8
|
+
s.authors = ["Sascha Brink"]
|
9
|
+
s.email = ["sascha.brink@gmail.com"]
|
10
|
+
s.homepage = "http://github.com/sbrink/thefacebook"
|
11
|
+
s.summary = %q{Facebook tools for rails to generate signed request}
|
12
|
+
s.description = %q{Facebook tools for rails to generate signed request. Helpers soon to be included.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "thefacebook"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
s.add_runtime_dependency "activesupport", ">= 3.0.0"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: thefacebook
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sascha Brink
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-19 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: &70220929106180 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70220929106180
|
25
|
+
description: Facebook tools for rails to generate signed request. Helpers soon to
|
26
|
+
be included.
|
27
|
+
email:
|
28
|
+
- sascha.brink@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- .gitignore
|
34
|
+
- Gemfile
|
35
|
+
- Rakefile
|
36
|
+
- lib/thefacebook.rb
|
37
|
+
- lib/thefacebook/base64_extensions.rb
|
38
|
+
- lib/thefacebook/signed_request.rb
|
39
|
+
- lib/thefacebook/version.rb
|
40
|
+
- spec/base64_extensions_test.rb
|
41
|
+
- spec/signed_request_test.rb
|
42
|
+
- thefacebook.gemspec
|
43
|
+
homepage: http://github.com/sbrink/thefacebook
|
44
|
+
licenses: []
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options: []
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project: thefacebook
|
63
|
+
rubygems_version: 1.8.10
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: Facebook tools for rails to generate signed request
|
67
|
+
test_files:
|
68
|
+
- spec/base64_extensions_test.rb
|
69
|
+
- spec/signed_request_test.rb
|