koinz 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README +54 -0
- data/lib/koinz/notification.rb +1 -1
- data/lib/koinz/omniauth_client.rb +37 -3
- data/lib/koinz/redis.rb +14 -1
- data/lib/koinz/version.rb +1 -1
- metadata +4 -4
data/README
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
The 'Koinz' gem is the client-library for koinz services:
|
2
|
+
- The Koinz omniauth provider (for OAuth2 access)
|
3
|
+
- For publishing and subscribing to Koinz notifications!
|
4
|
+
|
5
|
+
# Token Authentication #
|
6
|
+
|
7
|
+
As a koinz client-application, you can make 2 types of calls to other
|
8
|
+
applications:
|
9
|
+
- within the context of the an end-user (Standard OAuth)
|
10
|
+
- directly invoking a call without the end-user (2-legged)
|
11
|
+
|
12
|
+
To invoke an 'token-authenticable' call with user-context
|
13
|
+
=========================================================
|
14
|
+
|
15
|
+
## Only For User Manager ##
|
16
|
+
[param] auth_token: The auth token string
|
17
|
+
[param] uri: The uri to be invoked on the User Manager
|
18
|
+
|
19
|
+
[returns] Decoded Json information.
|
20
|
+
|
21
|
+
Koinz::OAuth2Client::UserManager.call(auth_token, uri)
|
22
|
+
|
23
|
+
Example:
|
24
|
+
Koinz::OAuth2Client::UserManager.call(auth_token, '/users/sign_out.json')
|
25
|
+
|
26
|
+
|
27
|
+
## For other applications ##
|
28
|
+
|
29
|
+
[param] auth_token: The auth token string
|
30
|
+
[param] host: The host you want to invoke this on. MERCHANT_APP, PARTNER_APP etc.
|
31
|
+
[param] uri: The uri to be invoked on the host
|
32
|
+
[param] params: optional arguments
|
33
|
+
|
34
|
+
[returns] Decoded Json information.
|
35
|
+
|
36
|
+
Koinz::OAuth2Client.Application.oauth_call(auth_token, host, uri, params => {})
|
37
|
+
|
38
|
+
Example:
|
39
|
+
Koinz::OAuth2Client.Application.oauth_call(auth_token, MERCHANT_APP, '/merchant.json', :name => 'name'
|
40
|
+
|
41
|
+
To invoke a '2-legged' call without user-context
|
42
|
+
=================================================
|
43
|
+
|
44
|
+
[param] host: The host you want to invoke this on. MERCHANT_APP, PARTNER_APP etc.
|
45
|
+
[param] uri: The uri to be invoked on the host
|
46
|
+
[param] params: optional arguments
|
47
|
+
|
48
|
+
Koinz::OAuth2Client::Application.two_legged_call(host, uri, params = {})
|
49
|
+
|
50
|
+
NOTE: This call is a protected call - internally it picks up the APP, APP_ID and APP_SECRET
|
51
|
+
of the application and secures a oauth_token. In this particular case, if the application
|
52
|
+
token has expired, it will be automatically refreshed!
|
53
|
+
|
54
|
+
|
data/lib/koinz/notification.rb
CHANGED
@@ -31,8 +31,9 @@ module Koinz
|
|
31
31
|
# @param [Hash] params to be passed in the URL
|
32
32
|
# TODO: Do we need to support Http-post?
|
33
33
|
# Example:
|
34
|
-
# Koinz::OAuth2Client.Application.
|
35
|
-
|
34
|
+
# Koinz::OAuth2Client.Application.oauth_call(auth_token, MERCHANT_APP,
|
35
|
+
# '/merchant', :name => 'name'
|
36
|
+
def self.oauth_call(access_token, host, uri, params = {})
|
36
37
|
# Prepare the entire URL
|
37
38
|
request_uri = "#{host}/#{uri}?access_token=#{access_token}"
|
38
39
|
|
@@ -42,6 +43,11 @@ module Koinz
|
|
42
43
|
end
|
43
44
|
|
44
45
|
response = Net::HTTP.get_response(URI.parse(request_uri))
|
46
|
+
|
47
|
+
# Raise an exception if response is not valid
|
48
|
+
# A redirect implies token is not valid
|
49
|
+
raise OAuth2::AccessDenied.new if [:found, :unauthorized].include?(response.code)
|
50
|
+
|
45
51
|
result = ActiveSupport::JSON.decode(response.body)
|
46
52
|
return result
|
47
53
|
|
@@ -49,7 +55,35 @@ module Koinz
|
|
49
55
|
return { :error => e.message }
|
50
56
|
end
|
51
57
|
|
52
|
-
|
58
|
+
|
59
|
+
# This is a method with which any application can make a 2-legged oauth call
|
60
|
+
# to the other apps. Its caters to token-expiry and exceptions.
|
61
|
+
# In case of error, it returns Json: { :error => <err-message> }
|
62
|
+
def self.two_legged_call(host, uri, params = {})
|
63
|
+
result = {}
|
64
|
+
3.times do |attempts|
|
65
|
+
@@SECURE_TOKEN ||= secure_token
|
66
|
+
result = oauth_call(@@SECURE_TOKEN.token, host, uri, params)
|
67
|
+
|
68
|
+
if result.is_a?(Hash) and result[:error] && result[:error] =~ /401|302/
|
69
|
+
# OAuth2::AccessDenied (Received HTTP 401 during request.)
|
70
|
+
# Token expired -- refresh and retry
|
71
|
+
|
72
|
+
@@SECURE_TOKEN = secure_token
|
73
|
+
else
|
74
|
+
break
|
75
|
+
end
|
76
|
+
end
|
77
|
+
return result
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
# Note: There is a dependency on APP, APP_ID, APP_SECRET
|
83
|
+
# set in the initializer of the application
|
84
|
+
def self.secure_token
|
85
|
+
Rails.logger.info("#{APP}, #{APP_ID}, #{APP_SECRET}")
|
86
|
+
strategy = OmniAuth::Strategies::Koinz.new(APP, APP_ID, APP_SECRET)
|
53
87
|
client = strategy.client
|
54
88
|
|
55
89
|
req_params = client.web_server.access_token_params(nil, { :redirect_uri => strategy.secure_callback_url})
|
data/lib/koinz/redis.rb
CHANGED
@@ -12,11 +12,13 @@ class KoinzRedis < Redis
|
|
12
12
|
timestamp = Time.now.to_i
|
13
13
|
zadd(channel, timestamp, MultiJson.encode([channel, message]))
|
14
14
|
super(channel, MultiJson.encode(message))
|
15
|
+
|
16
|
+
prune(channel)
|
15
17
|
end
|
16
18
|
|
17
19
|
# returns the pending messages [ event, payload ] pairs
|
18
20
|
# Events are ordered sets based on timstamp!
|
19
|
-
def
|
21
|
+
def backlog(channels, &block)
|
20
22
|
return if @timestamp == 0
|
21
23
|
|
22
24
|
Rails.logger.info('Processing Pending messages')
|
@@ -41,4 +43,15 @@ class KoinzRedis < Redis
|
|
41
43
|
|
42
44
|
Rails.logger.info('Completed processing of pending messages')
|
43
45
|
end
|
46
|
+
|
47
|
+
# For the sake of simplicity, speed and efficiency, we prune only events
|
48
|
+
# which we have just published!
|
49
|
+
def prune(channel)
|
50
|
+
# All the application timestamps. We have to pass varargs hence we send
|
51
|
+
# *keys to mget!
|
52
|
+
threshold = mget(*keys('*_timestamp_*')).sort.first # The earliest timestamp
|
53
|
+
|
54
|
+
# threshold is the timestamp before which all events should be destroyed
|
55
|
+
zremrangebyscore(channel, '-inf', threshold)
|
56
|
+
end
|
44
57
|
end
|
data/lib/koinz/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: koinz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Gautam Rege
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-14 00:00:00 +05:30
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|