Class: FbGraph::Auth::SignedRequest
- Inherits:
-
Object
- Object
- FbGraph::Auth::SignedRequest
- Defined in:
- lib/fb_graph/auth/signed_request.rb
Constant Summary collapse
- OAUTH_DIALOG_ENDPOINT =
'https://www.facebook.com/dialog/oauth'
Class Method Summary collapse
- .base64_url_decode(str) ⇒ Object
- .decode_json(json) ⇒ Object
- .sign(key, payload) ⇒ Object
- .verify(client, signed_request) ⇒ Object
Class Method Details
.base64_url_decode(str) ⇒ Object
34 35 36 37 38 |
# File 'lib/fb_graph/auth/signed_request.rb', line 34 def self.base64_url_decode(str) str += '=' * (4 - str.length.modulo(4)) str = str.gsub('-', '+').gsub('_', '/') Base64.decode64 str end |
.decode_json(json) ⇒ Object
28 29 30 31 32 |
# File 'lib/fb_graph/auth/signed_request.rb', line 28 def self.decode_json(json) MultiJson.load(json).with_indifferent_access rescue => e raise VerificationFailed.new('Invalid JSON') end |
.sign(key, payload) ⇒ Object
23 24 25 26 |
# File 'lib/fb_graph/auth/signed_request.rb', line 23 def self.sign(key, payload) klass = OpenSSL::Digest::SHA256.new OpenSSL::HMAC.digest(klass, key, payload) end |
.verify(client, signed_request) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 |
# File 'lib/fb_graph/auth/signed_request.rb', line 9 def self.verify(client, signed_request) signature, payload = signed_request.split('.') raise VerificationFailed.new('No Signature') if signature.blank? raise VerificationFailed.new('No Payload') if payload.blank? signature = base64_url_decode signature data = decode_json base64_url_decode(payload) raise VerificationFailed.new('Unexpected Signature Algorithm') unless data[:algorithm] == 'HMAC-SHA256' _signature_ = sign(client.secret, payload) raise VerificationFailed.new('Signature Invalid') unless signature == _signature_ data end |