Class: RedisToken

Inherits:
Object
  • Object
show all
Defined in:
lib/redis_token.rb,
lib/redis_token/version.rb,
lib/redis_token/serializers/native.rb

Defined Under Namespace

Classes: Serializers

Constant Summary collapse

DEFAULT_TTL =

Token lives 14 days by default

14 * 24 * 60 * 60
DEFAULT_PREFIX =
'tokens'.freeze
VERSION =
'0.0.7'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args = {}, opts = {}) ⇒ RedisToken

Create RedisToken instance

Implicit redis instance creation (redis parameters can be passed in args):

RedisToken.new(ttl: 5.days, prefix: 'project.tokens.', host: '127.0.0.1')

Explicit redis instance injection:

redis = Redis.new(host: '192.168.0.1', port: 33221)
RedisToken.new(redis, ttl: 5.days, prefix: 'project.tokens.')

Parameters:

  • args (Hash) (defaults to: {})

Options Hash (args):

  • :prefix (String) — default: DEFAULT_PREFIX

    redis keys prefix (e.g. ‘myproject.tokens.’)

  • :ttl (Integer)

    token time to live value (14 days by default)

  • :serializer_class (Class)

    serialization class, see RedisToken::Serializers::Native, or #use method



34
35
36
37
38
39
40
41
42
# File 'lib/redis_token.rb', line 34

def initialize(args = {}, opts = {})
  @redis = if args.nil? || args.is_a?(Hash)
             init_params(args)
             Redis.new(args)
           else
             init_params(opts)
             args
           end
end

Instance Attribute Details

#created_valueObject (readonly)

Returns the value of attribute created_value.



17
18
19
# File 'lib/redis_token.rb', line 17

def created_value
  @created_value
end

#default_ttlObject

Returns the value of attribute default_ttl.



15
16
17
# File 'lib/redis_token.rb', line 15

def default_ttl
  @default_ttl
end

#prefixObject

Returns the value of attribute prefix.



16
17
18
# File 'lib/redis_token.rb', line 16

def prefix
  @prefix
end

#redisObject (readonly)

Returns the value of attribute redis.



14
15
16
# File 'lib/redis_token.rb', line 14

def redis
  @redis
end

Instance Method Details

#allEnumerator

All tokens

Returns:

  • (Enumerator)


142
143
144
# File 'lib/redis_token.rb', line 142

def all
  all_tokens
end

#create(args = {}) ⇒ String

Create a new token

Parameters:

  • args (Hash) (defaults to: {})

Options Hash (args):

  • :owner (String)

    owner of a token, e.g. ‘client.1’ or ‘user-123’

  • :token (String) — default: SecureRandom.hex(16)

    user defined token

  • :payload (Object)
  • :ttl (Integer)

    redefines the default ttl

Returns:

  • (String)

    a new token



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/redis_token.rb', line 53

def create(args = {})
  token = args[:token] || generate_token
  value = { at: Time.now.to_i }

  owner = args[:owner]
  value[:owner] = owner if owner

  payload = args[:payload]
  value[:payload] = payload if payload

  @created_value = value
  key_ttl = args[:ttl] || @default_ttl

  @redis.multi do |multi|
    multi.set(token_to_key(token), serializer.pack(value), ex: key_ttl)
    multi.set(token_to_owner(owner, token), nil, ex: key_ttl)
  end

  token
end

#delete(token) ⇒ Boolean Also known as: del

Delete a token

Parameters:

  • token (String)

Returns:

  • (Boolean)


151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/redis_token.rb', line 151

def delete(token)
  key = token_to_key(token)
  value = redis_get(key)
  return false unless value

  @redis.multi do |multi|
    multi.del(key)
    multi.del(token_to_owner(hash_get(value, :owner), token))
  end

  true
end

#delete_allInteger

Delete all tokens

Returns:

  • (Integer)

    number of deleted tokens



185
186
187
# File 'lib/redis_token.rb', line 185

def delete_all
  delete_tokens(all_tokens)
end

#delete_owned_by(owner) ⇒ Integer

Delete all tokens of an owner

Returns:

  • (Integer)

    number of deleted tokens



171
172
173
# File 'lib/redis_token.rb', line 171

def delete_owned_by(owner)
  delete_tokens(owned_tokens(owner))
end

#delete_without_ownerInteger

Delete tokens without an owner

Returns:

  • (Integer)

    number of deleted tokens



178
179
180
# File 'lib/redis_token.rb', line 178

def delete_without_owner
  delete_tokens(owned_tokens)
end

#get(token, args = {}) ⇒ Hash

Get value of a token and slide ttl

Parameters:

  • token (String)
  • args (Hash) (defaults to: {})

Options Hash (args):

  • :ttl (Integer)
  • :slide_expire (Boolean) — default: true

    slide ttl of a token

Returns:

  • (Hash)

    value of a token



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/redis_token.rb', line 82

def get(token, args = {})
  key = token_to_key(token)
  value = redis_get(key)
  return unless value
  return value if args[:slide_expire] === false

  key_ttl = args[:ttl] || @default_ttl

  @redis.multi do |multi|
    multi.expire(key, key_ttl)
    multi.expire(token_to_owner(hash_get(value, :owner), token), key_ttl)
  end

  value
end

#owned_by(owner) ⇒ Enumerator

Iterate all exist tokens of an owner

Parameters:

  • owner (String)

Returns:

  • (Enumerator)


128
129
130
# File 'lib/redis_token.rb', line 128

def owned_by(owner)
  owned_tokens(owner)
end

#set(token, args = {}) ⇒ Boolean

Set new payload of a token

Parameters:

  • token (String)
  • args (Hash) (defaults to: {})

Options Hash (args):

  • :ttl (Integer)

    set new time to live value

  • :payload (Object)

    new payload value

Returns:

  • (Boolean)


106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/redis_token.rb', line 106

def set(token, args = {})
  key = token_to_key(token)
  value = redis_get(key)
  return false unless value

  value[:payload] = args[:payload]

  key_ttl = args[:ttl] || @redis.ttl(key)

  @redis.multi do |multi|
    multi.set(key, serializer.pack(value), ex: key_ttl)
    multi.expire(token_to_owner(hash_get(value, :owner), token), key_ttl)
  end

  true
end

#ttl(token) ⇒ Integer

Retrieve the remaining ttl of a token

Returns:

  • (Integer)

    ttl



192
193
194
# File 'lib/redis_token.rb', line 192

def ttl(token)
  @redis.ttl(token_to_key(token))
end

#use(serializer_class) ⇒ RedisToken

Use custom serialization class

Base serializer example:

class RedisToken
  class Serializers
    class Native
      def pack(value)
        Marshal.dump(value)
      end

      def unpack(value)
        Marshal.load(value)
      end
    end
  end
end

MessagePack example:

require 'msgpack'

class MsgPackSerializer
  def pack(value)
    MessagePack.pack(value)
  end

  def unpack(value)
    MessagePack.unpack(value)
  end
end

r = RedisToken.new.use(MsgPackSerializer)

Parameters:

  • serializer_class (Object)

Returns:



231
232
233
234
# File 'lib/redis_token.rb', line 231

def use(serializer_class)
  @serializer_class = serializer_class
  self
end

#without_ownerEnumerator

Tokens without an owner

Returns:

  • (Enumerator)


135
136
137
# File 'lib/redis_token.rb', line 135

def without_owner
  owned_tokens
end