1
1
package redis
2
2
3
3
import (
4
+ "fmt"
4
5
"time"
5
6
6
7
"github.com/go-redis/redis"
@@ -21,29 +22,39 @@ func NewRedisStore(opts *Options) *TokenStore {
21
22
if opts == nil {
22
23
panic ("options cannot be nil" )
23
24
}
24
- return NewRedisStoreWithCli (redis .NewClient (opts .redisOptions ()))
25
+ return NewRedisStoreWithCli (redis .NewClient (opts .redisOptions ()), opts . KeyNamespace )
25
26
}
26
27
27
28
// NewRedisStoreWithCli create an instance of a redis store
28
- func NewRedisStoreWithCli (cli * redis.Client ) * TokenStore {
29
- return & TokenStore {
29
+ func NewRedisStoreWithCli (cli * redis.Client , keyNamespace ... string ) * TokenStore {
30
+ store := & TokenStore {
30
31
cli : cli ,
31
32
}
33
+
34
+ if len (keyNamespace ) > 0 {
35
+ store .ns = keyNamespace [0 ]
36
+ }
37
+ return store
32
38
}
33
39
34
40
// NewRedisClusterStore create an instance of a redis cluster store
35
41
func NewRedisClusterStore (opts * ClusterOptions ) * TokenStore {
36
42
if opts == nil {
37
43
panic ("options cannot be nil" )
38
44
}
39
- return NewRedisClusterStoreWithCli (redis .NewClusterClient (opts .redisClusterOptions ()))
45
+ return NewRedisClusterStoreWithCli (redis .NewClusterClient (opts .redisClusterOptions ()), opts . KeyNamespace )
40
46
}
41
47
42
48
// NewRedisClusterStoreWithCli create an instance of a redis cluster store
43
- func NewRedisClusterStoreWithCli (cli * redis.ClusterClient ) * TokenStore {
44
- return & TokenStore {
49
+ func NewRedisClusterStoreWithCli (cli * redis.ClusterClient , keyNamespace ... string ) * TokenStore {
50
+ store := & TokenStore {
45
51
cli : cli ,
46
52
}
53
+
54
+ if len (keyNamespace ) > 0 {
55
+ store .ns = keyNamespace [0 ]
56
+ }
57
+ return store
47
58
}
48
59
49
60
type clienter interface {
@@ -56,13 +67,18 @@ type clienter interface {
56
67
// TokenStore redis token store
57
68
type TokenStore struct {
58
69
cli clienter
70
+ ns string
59
71
}
60
72
61
73
// Close close the store
62
74
func (s * TokenStore ) Close () error {
63
75
return s .cli .Close ()
64
76
}
65
77
78
+ func (s * TokenStore ) wrapperKey (key string ) string {
79
+ return fmt .Sprintf ("%s%s" , s .ns , key )
80
+ }
81
+
66
82
// Create Create and store the new token information
67
83
func (s * TokenStore ) Create (info oauth2.TokenInfo ) (err error ) {
68
84
ct := time .Now ()
@@ -73,7 +89,7 @@ func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
73
89
74
90
pipe := s .cli .TxPipeline ()
75
91
if code := info .GetCode (); code != "" {
76
- pipe .Set (code , jv , info .GetCodeExpiresIn ())
92
+ pipe .Set (s . wrapperKey ( code ) , jv , info .GetCodeExpiresIn ())
77
93
} else {
78
94
basicID := uuid .Must (uuid .NewRandom ()).String ()
79
95
aexp := info .GetAccessExpiresIn ()
@@ -84,11 +100,11 @@ func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
84
100
if aexp .Seconds () > rexp .Seconds () {
85
101
aexp = rexp
86
102
}
87
- pipe .Set (refresh , basicID , rexp )
103
+ pipe .Set (s . wrapperKey ( refresh ) , basicID , rexp )
88
104
}
89
105
90
- pipe .Set (info .GetAccess (), basicID , aexp )
91
- pipe .Set (basicID , jv , rexp )
106
+ pipe .Set (s . wrapperKey ( info .GetAccess () ), basicID , aexp )
107
+ pipe .Set (s . wrapperKey ( basicID ) , jv , rexp )
92
108
}
93
109
94
110
if _ , verr := pipe .Exec (); verr != nil {
@@ -99,7 +115,7 @@ func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
99
115
100
116
// remove
101
117
func (s * TokenStore ) remove (key string ) (err error ) {
102
- _ , verr := s .cli .Del (key ).Result ()
118
+ _ , verr := s .cli .Del (s . wrapperKey ( key ) ).Result ()
103
119
if verr != redis .Nil {
104
120
err = verr
105
121
}
@@ -125,29 +141,32 @@ func (s *TokenStore) RemoveByRefresh(refresh string) (err error) {
125
141
}
126
142
127
143
func (s * TokenStore ) getData (key string ) (ti oauth2.TokenInfo , err error ) {
128
- result := s .cli .Get (key )
144
+ result := s .cli .Get (s . wrapperKey ( key ) )
129
145
if verr := result .Err (); verr != nil {
130
146
if verr == redis .Nil {
131
147
return
132
148
}
133
149
err = verr
134
150
return
135
151
}
152
+
136
153
iv , err := result .Bytes ()
137
154
if err != nil {
138
155
return
139
156
}
157
+
140
158
var tm models.Token
141
159
if verr := jsonUnmarshal (iv , & tm ); verr != nil {
142
160
err = verr
143
161
return
144
162
}
163
+
145
164
ti = & tm
146
165
return
147
166
}
148
167
149
168
func (s * TokenStore ) getBasicID (token string ) (basicID string , err error ) {
150
- tv , verr := s .cli .Get (token ).Result ()
169
+ tv , verr := s .cli .Get (s . wrapperKey ( token ) ).Result ()
151
170
if verr != nil {
152
171
if verr == redis .Nil {
153
172
return
0 commit comments