5
5
"time"
6
6
7
7
"github.com/go-redis/redis"
8
- "github.com/json-iterator/go"
8
+ jsoniter "github.com/json-iterator/go"
9
9
"gopkg.in/oauth2.v3"
10
10
"gopkg.in/oauth2.v3/models"
11
11
"gopkg.in/oauth2.v3/utils/uuid"
@@ -59,6 +59,7 @@ func NewRedisClusterStoreWithCli(cli *redis.ClusterClient, keyNamespace ...strin
59
59
60
60
type clienter interface {
61
61
Get (key string ) * redis.StringCmd
62
+ Exists (key ... string ) * redis.IntCmd
62
63
TxPipeline () redis.Pipeliner
63
64
Del (keys ... string ) * redis.IntCmd
64
65
Close () error
@@ -79,12 +80,104 @@ func (s *TokenStore) wrapperKey(key string) string {
79
80
return fmt .Sprintf ("%s%s" , s .ns , key )
80
81
}
81
82
83
+ func (s * TokenStore ) checkError (result redis.Cmder ) (bool , error ) {
84
+ if err := result .Err (); err != nil {
85
+ if err == redis .Nil {
86
+ return true , nil
87
+ }
88
+ return false , err
89
+ }
90
+ return false , nil
91
+ }
92
+
93
+ // remove
94
+ func (s * TokenStore ) remove (key string ) error {
95
+ result := s .cli .Del (s .wrapperKey (key ))
96
+ _ , err := s .checkError (result )
97
+ return err
98
+ }
99
+
100
+ func (s * TokenStore ) removeToken (tokenString string , isRefresh bool ) error {
101
+ basicID , err := s .getBasicID (tokenString )
102
+ if err != nil {
103
+ return err
104
+ } else if basicID == "" {
105
+ return nil
106
+ }
107
+
108
+ err = s .remove (tokenString )
109
+ if err != nil {
110
+ return err
111
+ }
112
+
113
+ token , err := s .getToken (basicID )
114
+ if err != nil {
115
+ return err
116
+ } else if token == nil {
117
+ return nil
118
+ }
119
+
120
+ checkToken := token .GetRefresh ()
121
+ if isRefresh {
122
+ checkToken = token .GetAccess ()
123
+ }
124
+ iresult := s .cli .Exists (s .wrapperKey (checkToken ))
125
+ if err := iresult .Err (); err != nil && err != redis .Nil {
126
+ return err
127
+ } else if iresult .Val () == 0 {
128
+ return s .remove (basicID )
129
+ }
130
+
131
+ return nil
132
+ }
133
+
134
+ func (s * TokenStore ) parseToken (result * redis.StringCmd ) (oauth2.TokenInfo , error ) {
135
+ if ok , err := s .checkError (result ); err != nil {
136
+ return nil , err
137
+ } else if ok {
138
+ return nil , nil
139
+ }
140
+
141
+ buf , err := result .Bytes ()
142
+ if err != nil {
143
+ if err == redis .Nil {
144
+ return nil , nil
145
+ }
146
+ return nil , err
147
+ }
148
+
149
+ var token models.Token
150
+ if err := jsonUnmarshal (buf , & token ); err != nil {
151
+ return nil , err
152
+ }
153
+ return & token , nil
154
+ }
155
+
156
+ func (s * TokenStore ) getToken (key string ) (oauth2.TokenInfo , error ) {
157
+ result := s .cli .Get (s .wrapperKey (key ))
158
+ return s .parseToken (result )
159
+ }
160
+
161
+ func (s * TokenStore ) parseBasicID (result * redis.StringCmd ) (string , error ) {
162
+ if ok , err := s .checkError (result ); err != nil {
163
+ return "" , err
164
+ } else if ok {
165
+ return "" , nil
166
+ }
167
+ return result .Val (), nil
168
+ }
169
+
170
+ func (s * TokenStore ) getBasicID (token string ) (string , error ) {
171
+ result := s .cli .Get (s .wrapperKey (token ))
172
+ return s .parseBasicID (result )
173
+ }
174
+
82
175
// Create Create and store the new token information
83
- func (s * TokenStore ) Create (info oauth2.TokenInfo ) ( err error ) {
176
+ func (s * TokenStore ) Create (info oauth2.TokenInfo ) error {
84
177
ct := time .Now ()
85
178
jv , err := jsonMarshal (info )
86
179
if err != nil {
87
- return
180
+ return err
88
181
}
89
182
90
183
pipe := s .cli .TxPipeline ()
@@ -107,99 +200,46 @@ func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
107
200
pipe .Set (s .wrapperKey (basicID ), jv , rexp )
108
201
}
109
202
110
- if _ , verr := pipe .Exec (); verr != nil {
111
- err = verr
203
+ if _ , err := pipe .Exec (); err != nil {
204
+ return err
112
205
}
113
- return
114
- }
115
-
116
- // remove
117
- func (s * TokenStore ) remove (key string ) (err error ) {
118
- _ , verr := s .cli .Del (s .wrapperKey (key )).Result ()
119
- if verr != redis .Nil {
120
- err = verr
121
- }
122
- return
206
+ return nil
123
207
}
124
208
125
209
// RemoveByCode Use the authorization code to delete the token information
126
- func (s * TokenStore ) RemoveByCode (code string ) (err error ) {
127
- err = s .remove (code )
128
- return
210
+ func (s * TokenStore ) RemoveByCode (code string ) error {
211
+ return s .remove (code )
129
212
}
130
213
131
214
// RemoveByAccess Use the access token to delete the token information
132
- func (s * TokenStore ) RemoveByAccess (access string ) (err error ) {
133
- err = s .remove (access )
134
- return
215
+ func (s * TokenStore ) RemoveByAccess (access string ) error {
216
+ return s .removeToken (access , false )
135
217
}
136
218
137
219
// RemoveByRefresh Use the refresh token to delete the token information
138
- func (s * TokenStore ) RemoveByRefresh (refresh string ) (err error ) {
139
- err = s .remove (refresh )
140
- return
141
- }
142
-
143
- func (s * TokenStore ) getData (key string ) (ti oauth2.TokenInfo , err error ) {
144
- result := s .cli .Get (s .wrapperKey (key ))
145
- if verr := result .Err (); verr != nil {
146
- if verr == redis .Nil {
147
- return
148
- }
149
- err = verr
150
- return
151
- }
152
-
153
- iv , err := result .Bytes ()
154
- if err != nil {
155
- return
156
- }
157
-
158
- var tm models.Token
159
- if verr := jsonUnmarshal (iv , & tm ); verr != nil {
160
- err = verr
161
- return
162
- }
163
-
164
- ti = & tm
165
- return
166
- }
167
-
168
- func (s * TokenStore ) getBasicID (token string ) (basicID string , err error ) {
169
- tv , verr := s .cli .Get (s .wrapperKey (token )).Result ()
170
- if verr != nil {
171
- if verr == redis .Nil {
172
- return
173
- }
174
- err = verr
175
- return
176
- }
177
- basicID = tv
178
- return
220
+ func (s * TokenStore ) RemoveByRefresh (refresh string ) error {
221
+ return s .removeToken (refresh , false )
179
222
}
180
223
181
224
// GetByCode Use the authorization code for token information data
182
- func (s * TokenStore ) GetByCode (code string ) (ti oauth2.TokenInfo , err error ) {
183
- ti , err = s .getData (code )
184
- return
225
+ func (s * TokenStore ) GetByCode (code string ) (oauth2.TokenInfo , error ) {
226
+ return s .getToken (code )
185
227
}
186
228
187
229
// GetByAccess Use the access token for token information data
188
- func (s * TokenStore ) GetByAccess (access string ) (ti oauth2.TokenInfo , err error ) {
230
+ func (s * TokenStore ) GetByAccess (access string ) (oauth2.TokenInfo , error ) {
189
231
basicID , err := s .getBasicID (access )
190
232
if err != nil || basicID == "" {
191
- return
233
+ return nil , err
192
234
}
193
- ti , err = s .getData (basicID )
194
- return
235
+ return s .getToken (basicID )
195
236
}
196
237
197
238
// GetByRefresh Use the refresh token for token information data
198
- func (s * TokenStore ) GetByRefresh (refresh string ) (ti oauth2.TokenInfo , err error ) {
239
+ func (s * TokenStore ) GetByRefresh (refresh string ) (oauth2.TokenInfo , error ) {
199
240
basicID , err := s .getBasicID (refresh )
200
241
if err != nil || basicID == "" {
201
- return
242
+ return nil , err
202
243
}
203
- ti , err = s .getData (basicID )
204
- return
244
+ return s .getToken (basicID )
205
245
}
0 commit comments