lib/rest-firebase.rb in rest-firebase-0.9.1 vs lib/rest-firebase.rb in rest-firebase-0.9.2
- old
+ new
@@ -1,11 +1,11 @@
require 'rest-core'
# https://www.firebase.com/docs/security/custom-login.html
# https://www.firebase.com/docs/rest-api.html
-RestFirebase = RC::Builder.client(:d, :secret, :auth) do
+RestFirebase = RC::Builder.client(:d, :secret, :auth, :iat) do
use RC::Timeout , 10
use RC::DefaultSite , 'https://SampleChat.firebaseIO-demo.com/'
use RC::DefaultHeaders, {'Accept' => 'application/json',
'Content-Type' => 'application/json'}
@@ -73,10 +73,12 @@
end
end
end
def request env, app=app
+ check_auth
+
path = "#{env[REQUEST_PATH]}.json"
payload = if env[REQUEST_PAYLOAD]
{REQUEST_PAYLOAD => Json.encode(env[REQUEST_PAYLOAD])}
else
{}
@@ -88,20 +90,25 @@
def generate_auth opts={}
raise RestFirebase::Error::ClientError.new(
"Please set your secret") unless secret
header = {:typ => 'JWT', :alg => 'HS256'}
- claims = {:v => 0, :iat => Time.now.to_i, :d => d}.merge(opts)
+ claims = {:v => 0, :iat => iat, :d => d}.merge(opts)
# http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-26
input = [header, claims].map{ |d| base64url(Json.encode(d)) }.join('.')
# http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-20
"#{input}.#{base64url(Hmac.sha256(secret, input))}"
end
private
def base64url str; [str].pack('m').tr('+/', '-_'); end
def default_query; {:auth => auth}; end
def default_auth ; generate_auth ; end
+ def default_iat ; Time.now.to_i ; end
+
+ def check_auth
+ self.auth = nil if iat && Time.now.to_i - iat > 82800
+ end
end
class RestFirebase
include RestFirebase::Client
self.event_source_class = EventSource