Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 50a8b74

Browse files
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

Lines changed: 4 additions & 1 deletion
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

Lines changed: 113 additions & 73 deletions
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) (errerror) {
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+
returnerr
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+
returnerr
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) (tioauth2.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+
returnnil, 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) (tioauth2.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+
returnnil, err
202243
}
203-
ti, err = s.getData(basicID)
204-
return
244+
return s.getToken(basicID)
205245
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /