redis_token 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +27 -0
- data/lib/redis_token/serializers/native.rb +13 -0
- data/lib/redis_token/version.rb +1 -1
- data/lib/redis_token.rb +66 -11
- data/redis_token.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 875d8513b286fd87257c6f5dfb329b290651e18b
|
4
|
+
data.tar.gz: 3d95c64ffa4c45c18cb1696ce3a42e9de07ae042
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c907b23ac817799726c69fcbe206bbfd160c61eda0b074eda50dec93dc2f4ddd47272f92e8af807df2f928023d125656f474442930ef4252cac1ca8b601ce3cf
|
7
|
+
data.tar.gz: 72d605d0d3f28e5e6b7256e383d6224ec63533dd49b202a017a2e2e419c1d4a3a40a1b433e4254f280e6a1b07b71c0282f45025693e69af9fee26002bd3929f5
|
data/README.md
CHANGED
@@ -94,6 +94,10 @@ user_token = r.create("u:#{current_user.id}", ttl: 15.hours)
|
|
94
94
|
# Create token with payload:
|
95
95
|
mobile_token = r.create("c.#{client.id}", payload: { source: :native })
|
96
96
|
# => "865249d6b87c4e6dd8f6b0796ace7fa0"
|
97
|
+
|
98
|
+
# Save exist token:
|
99
|
+
r.create('api', token: SecureRandom.uuid)
|
100
|
+
# => "aed6e179-14b4-4a8c-9a1b-6b0f9150ede3"
|
97
101
|
```
|
98
102
|
|
99
103
|
### Get token
|
@@ -140,3 +144,26 @@ r.delete('865249d6b87c4e6dd8f6b0796ace7fa0')
|
|
140
144
|
r.delete_all('client.1')
|
141
145
|
# => 8
|
142
146
|
```
|
147
|
+
|
148
|
+
### Serialization
|
149
|
+
|
150
|
+
redis_token uses native Marshal class for data serialization by default. You can override it like this:
|
151
|
+
|
152
|
+
```ruby
|
153
|
+
require 'msgpack'
|
154
|
+
|
155
|
+
class MsgPackSerializer
|
156
|
+
def pack(value)
|
157
|
+
MessagePack.pack(value)
|
158
|
+
end
|
159
|
+
|
160
|
+
def unpack(value)
|
161
|
+
MessagePack.unpack(value)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
r = RedisToken.new(prefix: PREFIX, serializer_class: MsgPackSerializer)
|
166
|
+
# Or
|
167
|
+
r = RedisToken.new(prefix: PREFIX)
|
168
|
+
r.use(MsgPackSerializer)
|
169
|
+
```
|
data/lib/redis_token/version.rb
CHANGED
data/lib/redis_token.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'redis_token/version'
|
2
|
+
require 'redis_token/serializers/native'
|
3
|
+
|
2
4
|
require 'redis'
|
3
5
|
|
4
6
|
require 'securerandom'
|
@@ -25,6 +27,7 @@ class RedisToken
|
|
25
27
|
# @param [Hash] args
|
26
28
|
# @option args [String] :prefix redis keys prefix (e.g. 'myproject.tokens.')
|
27
29
|
# @option args [Integer] :ttl token time to live value (14 days by default)
|
30
|
+
# @option args [Class] :serializer_class serialization class, see RedisToken::Serializers::Native, or #use method
|
28
31
|
#
|
29
32
|
# @return [RedisToken] a new RedisToken instance
|
30
33
|
def initialize(args = {}, opts = {})
|
@@ -41,6 +44,7 @@ class RedisToken
|
|
41
44
|
#
|
42
45
|
# @param [String] owner owner of a token, e.g. 'client.1' or 'user-123'
|
43
46
|
# @param [Hash] args
|
47
|
+
# @option args [String] :token (SecureRandom.hex(16)) user defined token
|
44
48
|
# @option args :payload
|
45
49
|
# @option args [Integer] :ttl redefines the default ttl
|
46
50
|
#
|
@@ -49,7 +53,7 @@ class RedisToken
|
|
49
53
|
raise 'owner should be specified' unless owner
|
50
54
|
|
51
55
|
token = args[:token] || generate_token
|
52
|
-
value = { owner: owner, at: Time.now }
|
56
|
+
value = { owner: owner, at: Time.now.to_i }
|
53
57
|
|
54
58
|
payload = args[:payload]
|
55
59
|
value[:payload] = payload if payload
|
@@ -58,7 +62,7 @@ class RedisToken
|
|
58
62
|
key_ttl = args[:ttl] || @default_ttl
|
59
63
|
|
60
64
|
@redis.multi do |multi|
|
61
|
-
multi.set(token_to_key(token),
|
65
|
+
multi.set(token_to_key(token), serializer.pack(value), ex: key_ttl)
|
62
66
|
multi.set(token_to_owner(owner, token), nil, ex: key_ttl)
|
63
67
|
end
|
64
68
|
|
@@ -83,7 +87,7 @@ class RedisToken
|
|
83
87
|
|
84
88
|
@redis.multi do |multi|
|
85
89
|
multi.expire(key, key_ttl)
|
86
|
-
multi.expire(token_to_owner(value
|
90
|
+
multi.expire(token_to_owner(hash_get(value, :owner), token), key_ttl)
|
87
91
|
end
|
88
92
|
|
89
93
|
value
|
@@ -106,8 +110,8 @@ class RedisToken
|
|
106
110
|
key_ttl = args[:ttl] || @redis.ttl(key)
|
107
111
|
|
108
112
|
@redis.multi do |multi|
|
109
|
-
multi.set(key,
|
110
|
-
multi.expire(token_to_owner(value
|
113
|
+
multi.set(key, serializer.pack(value), ex: key_ttl)
|
114
|
+
multi.expire(token_to_owner(hash_get(value, :owner), token), key_ttl)
|
111
115
|
end
|
112
116
|
|
113
117
|
true
|
@@ -119,7 +123,7 @@ class RedisToken
|
|
119
123
|
#
|
120
124
|
# @return [Enumerator]
|
121
125
|
def owned_by(owner)
|
122
|
-
owned_tokens(owner).map { |token| [token, redis_get(token_to_key(token))]}
|
126
|
+
owned_tokens(owner).map { |token| [token, redis_get(token_to_key(token))] }
|
123
127
|
end
|
124
128
|
|
125
129
|
# Delete a token
|
@@ -134,7 +138,7 @@ class RedisToken
|
|
134
138
|
|
135
139
|
@redis.multi do |multi|
|
136
140
|
multi.del(key)
|
137
|
-
multi.del(token_to_owner(value
|
141
|
+
multi.del(token_to_owner(hash_get(value, :owner), token))
|
138
142
|
end
|
139
143
|
|
140
144
|
true
|
@@ -166,6 +170,46 @@ class RedisToken
|
|
166
170
|
@redis.ttl(token_to_key(token))
|
167
171
|
end
|
168
172
|
|
173
|
+
# Use custom serialization class
|
174
|
+
#
|
175
|
+
# Base serializer example:
|
176
|
+
# class RedisToken
|
177
|
+
# class Serializers
|
178
|
+
# class Native
|
179
|
+
# def pack(value)
|
180
|
+
# Marshal.dump(value)
|
181
|
+
# end
|
182
|
+
#
|
183
|
+
# def unpack(value)
|
184
|
+
# Marshal.load(value)
|
185
|
+
# end
|
186
|
+
# end
|
187
|
+
# end
|
188
|
+
# end
|
189
|
+
#
|
190
|
+
# MessagePack example:
|
191
|
+
# require 'msgpack'
|
192
|
+
#
|
193
|
+
# class MsgPackSerializer
|
194
|
+
# def pack(value)
|
195
|
+
# MessagePack.pack(value)
|
196
|
+
# end
|
197
|
+
#
|
198
|
+
# def unpack(value)
|
199
|
+
# MessagePack.unpack(value)
|
200
|
+
# end
|
201
|
+
# end
|
202
|
+
#
|
203
|
+
# RedisToken.new(prefix: PREFIX).use(MsgPackSerializer)
|
204
|
+
#
|
205
|
+
# @param [Object] serializer_class
|
206
|
+
#
|
207
|
+
# @return [RedisToken]
|
208
|
+
def use(serializer_class)
|
209
|
+
@serializer_class = serializer_class
|
210
|
+
self
|
211
|
+
end
|
212
|
+
|
169
213
|
private
|
170
214
|
|
171
215
|
def generate_token
|
@@ -175,6 +219,9 @@ class RedisToken
|
|
175
219
|
def init_params(args)
|
176
220
|
@default_ttl = args[:ttl] || DEFAULT_TTL
|
177
221
|
@prefix = args[:prefix]
|
222
|
+
|
223
|
+
@serializer_class = args[:serializer_class]
|
224
|
+
@serializer_class = Serializers::Native unless @serializer_class
|
178
225
|
end
|
179
226
|
|
180
227
|
def token_to_key(token)
|
@@ -192,25 +239,33 @@ class RedisToken
|
|
192
239
|
def redis_get(key)
|
193
240
|
value = @redis.get(key)
|
194
241
|
return unless value
|
195
|
-
|
242
|
+
serializer.unpack(value)
|
196
243
|
end
|
197
244
|
|
198
245
|
def owned_tokens(owner)
|
199
246
|
mask = "#{@prefix}#{owner}.*"
|
200
247
|
|
201
248
|
Enumerator.new do |y|
|
202
|
-
cursor = 0
|
249
|
+
cursor = '0'
|
203
250
|
loop do
|
204
251
|
cursor, r = @redis.scan(cursor, match: mask)
|
205
|
-
cursor = cursor.to_i
|
206
252
|
|
207
253
|
r.each do |key|
|
208
254
|
token = owner_key_to_token(owner, key)
|
209
255
|
y << token
|
210
256
|
end
|
211
257
|
|
212
|
-
break if cursor == 0
|
258
|
+
break if cursor == '0'
|
213
259
|
end
|
214
260
|
end
|
215
261
|
end
|
262
|
+
|
263
|
+
def serializer
|
264
|
+
@serializer ||= @serializer_class.new
|
265
|
+
end
|
266
|
+
|
267
|
+
# Some serializers can't store symbols out of the box
|
268
|
+
def hash_get(hash, sym)
|
269
|
+
hash.key?(sym) ? hash[sym] : hash[sym.to_s]
|
270
|
+
end
|
216
271
|
end
|
data/redis_token.gemspec
CHANGED
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_development_dependency 'rake', '~> 10.0'
|
29
29
|
spec.add_development_dependency 'minitest', '~> 5.10', '>= 5.10.3'
|
30
30
|
spec.add_development_dependency 'minitest-reporters', '~> 1.1', '>= 1.1.14'
|
31
|
+
spec.add_development_dependency 'pry', '~> 0.10.4'
|
31
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_token
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Baikuzin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -98,6 +98,20 @@ dependencies:
|
|
98
98
|
- - ">="
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: 1.1.14
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: pry
|
103
|
+
requirement: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - "~>"
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: 0.10.4
|
108
|
+
type: :development
|
109
|
+
prerelease: false
|
110
|
+
version_requirements: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - "~>"
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: 0.10.4
|
101
115
|
description: Create and get API tokens with redis
|
102
116
|
email:
|
103
117
|
- ybinzu@gmail.com
|
@@ -111,6 +125,7 @@ files:
|
|
111
125
|
- README.md
|
112
126
|
- Rakefile
|
113
127
|
- lib/redis_token.rb
|
128
|
+
- lib/redis_token/serializers/native.rb
|
114
129
|
- lib/redis_token/version.rb
|
115
130
|
- redis_token.gemspec
|
116
131
|
homepage: https://github.com/ybinzu/redis_token
|