Skip to content

Commit 50a8b74

Browse files
committed
Optimize the issue of basicID expiration
1 parent d446af2 commit 50a8b74

File tree

2 files changed

+117
-74
lines changed

2 files changed

+117
-74
lines changed

README.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ func main() {
2828
}))
2929

3030
// use redis cluster store
31-
// redis.NewRedisClusterStore()
31+
// manager.MapTokenStorage(redis.NewRedisClusterStore(&redis.ClusterOptions{
32+
// Addrs: []string{"127.0.0.1:6379"},
33+
// DB: 15,
34+
// }))
3235
}
3336
```
3437

redis.go

+113-73
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"time"
66

77
"github.com/go-redis/redis"
8-
"github.com/json-iterator/go"
8+
jsoniter "github.com/json-iterator/go"
99
"gopkg.in/oauth2.v3"
1010
"gopkg.in/oauth2.v3/models"
1111
"gopkg.in/oauth2.v3/utils/uuid"
@@ -59,6 +59,7 @@ func NewRedisClusterStoreWithCli(cli *redis.ClusterClient, keyNamespace ...strin
5959

6060
type clienter interface {
6161
Get(key string) *redis.StringCmd
62+
Exists(key ...string) *redis.IntCmd
6263
TxPipeline() redis.Pipeliner
6364
Del(keys ...string) *redis.IntCmd
6465
Close() error
@@ -79,12 +80,104 @@ func (s *TokenStore) wrapperKey(key string) string {
7980
return fmt.Sprintf("%s%s", s.ns, key)
8081
}
8182

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+
82175
// 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 {
84177
ct := time.Now()
85178
jv, err := jsonMarshal(info)
86179
if err != nil {
87-
return
180+
return err
88181
}
89182

90183
pipe := s.cli.TxPipeline()
@@ -107,99 +200,46 @@ func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
107200
pipe.Set(s.wrapperKey(basicID), jv, rexp)
108201
}
109202

110-
if _, verr := pipe.Exec(); verr != nil {
111-
err = verr
203+
if _, err := pipe.Exec(); err != nil {
204+
return err
112205
}
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
123207
}
124208

125209
// 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)
129212
}
130213

131214
// 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)
135217
}
136218

137219
// 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)
179222
}
180223

181224
// 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)
185227
}
186228

187229
// 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) {
189231
basicID, err := s.getBasicID(access)
190232
if err != nil || basicID == "" {
191-
return
233+
return nil, err
192234
}
193-
ti, err = s.getData(basicID)
194-
return
235+
return s.getToken(basicID)
195236
}
196237

197238
// 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) {
199240
basicID, err := s.getBasicID(refresh)
200241
if err != nil || basicID == "" {
201-
return
242+
return nil, err
202243
}
203-
ti, err = s.getData(basicID)
204-
return
244+
return s.getToken(basicID)
205245
}

0 commit comments

Comments
 (0)