redis_token 0.0.4 → 0.0.5
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.
- 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
|