Skip to content

Commit 72bcf52

Browse files
committed
Add the authorization code storage support
1 parent da15acc commit 72bcf52

File tree

2 files changed

+78
-25
lines changed

2 files changed

+78
-25
lines changed

token.go

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,23 @@ func (rs *TokenStore) Create(info oauth2.TokenInfo) (err error) {
4747
return
4848
}
4949
pipe := rs.cli.Pipeline()
50-
basicID := uuid.NewV4().String()
51-
aexp := info.GetAccessExpiresIn()
52-
rexp := aexp
53-
54-
if refresh := info.GetRefresh(); refresh != "" {
55-
rexp = info.GetRefreshCreateAt().Add(info.GetRefreshExpiresIn()).Sub(ct)
56-
if aexp.Seconds() > rexp.Seconds() {
57-
aexp = rexp
50+
if code := info.GetCode(); code != "" {
51+
pipe.Set(code, jv, info.GetCodeExpiresIn())
52+
} else {
53+
basicID := uuid.NewV4().String()
54+
aexp := info.GetAccessExpiresIn()
55+
rexp := aexp
56+
57+
if refresh := info.GetRefresh(); refresh != "" {
58+
rexp = info.GetRefreshCreateAt().Add(info.GetRefreshExpiresIn()).Sub(ct)
59+
if aexp.Seconds() > rexp.Seconds() {
60+
aexp = rexp
61+
}
62+
pipe.Set(refresh, basicID, rexp)
5863
}
59-
pipe.Set(refresh, basicID, rexp)
64+
pipe.Set(info.GetAccess(), basicID, aexp)
65+
pipe.Set(basicID, jv, rexp)
6066
}
61-
pipe.Set(info.GetAccess(), basicID, aexp)
62-
pipe.Set(basicID, jv, rexp)
6367

6468
if _, verr := pipe.Exec(); verr != nil {
6569
err = verr
@@ -76,6 +80,12 @@ func (rs *TokenStore) remove(key string) (err error) {
7680
return
7781
}
7882

83+
// RemoveByCode Use the authorization code to delete the token information
84+
func (rs *TokenStore) RemoveByCode(code string) (err error) {
85+
err = rs.remove(code)
86+
return
87+
}
88+
7989
// RemoveByAccess Use the access token to delete the token information
8090
func (rs *TokenStore) RemoveByAccess(access string) (err error) {
8191
err = rs.remove(access)
@@ -88,17 +98,8 @@ func (rs *TokenStore) RemoveByRefresh(refresh string) (err error) {
8898
return
8999
}
90100

91-
// get
92-
func (rs *TokenStore) get(token string) (ti oauth2.TokenInfo, err error) {
93-
tv, verr := rs.cli.Get(token).Result()
94-
if verr != nil {
95-
if verr == redis.Nil {
96-
return
97-
}
98-
err = verr
99-
return
100-
}
101-
result := rs.cli.Get(tv)
101+
func (rs *TokenStore) getData(key string) (ti oauth2.TokenInfo, err error) {
102+
result := rs.cli.Get(key)
102103
if verr := result.Err(); verr != nil {
103104
if verr == redis.Nil {
104105
return
@@ -119,14 +120,41 @@ func (rs *TokenStore) get(token string) (ti oauth2.TokenInfo, err error) {
119120
return
120121
}
121122

123+
func (rs *TokenStore) getBasicID(token string) (basicID string, err error) {
124+
tv, verr := rs.cli.Get(token).Result()
125+
if verr != nil {
126+
if verr == redis.Nil {
127+
return
128+
}
129+
err = verr
130+
return
131+
}
132+
basicID = tv
133+
return
134+
}
135+
136+
// GetByCode Use the authorization code for token information data
137+
func (rs *TokenStore) GetByCode(code string) (ti oauth2.TokenInfo, err error) {
138+
ti, err = rs.getData(code)
139+
return
140+
}
141+
122142
// GetByAccess Use the access token for token information data
123143
func (rs *TokenStore) GetByAccess(access string) (ti oauth2.TokenInfo, err error) {
124-
ti, err = rs.get(access)
144+
basicID, err := rs.getBasicID(access)
145+
if err != nil || basicID == "" {
146+
return
147+
}
148+
ti, err = rs.getData(basicID)
125149
return
126150
}
127151

128152
// GetByRefresh Use the refresh token for token information data
129153
func (rs *TokenStore) GetByRefresh(refresh string) (ti oauth2.TokenInfo, err error) {
130-
ti, err = rs.get(refresh)
154+
basicID, err := rs.getBasicID(refresh)
155+
if err != nil || basicID == "" {
156+
return
157+
}
158+
ti, err = rs.getData(basicID)
131159
return
132160
}

token_test.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,31 @@ func TestTokenStore(t *testing.T) {
1818
store, err := redis.NewTokenStore(cfg)
1919
So(err, ShouldBeNil)
2020

21+
Convey("Test authorization code store", func() {
22+
info := &models.Token{
23+
ClientID: "1",
24+
UserID: "1_1",
25+
RedirectURI: "http://localhost/",
26+
Scope: "all",
27+
Code: "11_11_11",
28+
CodeCreateAt: time.Now(),
29+
CodeExpiresIn: time.Second * 5,
30+
}
31+
err := store.Create(info)
32+
So(err, ShouldBeNil)
33+
34+
cinfo, err := store.GetByCode(info.Code)
35+
So(err, ShouldBeNil)
36+
So(cinfo.GetUserID(), ShouldEqual, info.UserID)
37+
38+
err = store.RemoveByCode(info.Code)
39+
So(err, ShouldBeNil)
40+
41+
cinfo, err = store.GetByCode(info.Code)
42+
So(err, ShouldBeNil)
43+
So(cinfo, ShouldBeNil)
44+
})
45+
2146
Convey("Test access token store", func() {
2247
info := &models.Token{
2348
ClientID: "1",
@@ -54,7 +79,7 @@ func TestTokenStore(t *testing.T) {
5479
AccessExpiresIn: time.Second * 5,
5580
Refresh: "1_2_2",
5681
RefreshCreateAt: time.Now(),
57-
RefreshExpiresIn: time.Minute * 1,
82+
RefreshExpiresIn: time.Second * 15,
5883
}
5984
err := store.Create(info)
6085
So(err, ShouldBeNil)

0 commit comments

Comments
 (0)