Skip to content

Commit 6149fb5

Browse files
authored
Merge pull request #5 from Tazer/master
added support for key prefix / namespacing
2 parents de39c2c + 2a305b9 commit 6149fb5

File tree

3 files changed

+102
-9
lines changed

3 files changed

+102
-9
lines changed

config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ type Config struct {
6666

6767
// TLS Config to use. When set TLS will be negotiated.
6868
TLSConfig *tls.Config
69+
70+
//KeyNamespace used for prefixing/namespacing keys.
71+
KeyNamespace string
6972
}
7073

7174
func (o *Config) redisOptions() *redis.Options {

token.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ func NewTokenStore(cfg *Config) (ts oauth2.TokenStore, err error) {
2020
err = verr
2121
return
2222
}
23-
ts = &TokenStore{cli: cli}
23+
ts = &TokenStore{cli: cli, KeyNamespace: cfg.KeyNamespace}
2424
return
2525
}
2626

2727
// TokenStore redis token store
2828
type TokenStore struct {
29-
cli *redis.Client
29+
cli *redis.Client
30+
KeyNamespace string
3031
}
3132

3233
// Create Create and store the new token information
@@ -39,7 +40,7 @@ func (rs *TokenStore) Create(info oauth2.TokenInfo) (err error) {
3940

4041
pipe := rs.cli.Pipeline()
4142
if code := info.GetCode(); code != "" {
42-
pipe.Set(code, jv, info.GetCodeExpiresIn())
43+
pipe.Set(rs.KeyNamespace+code, jv, info.GetCodeExpiresIn())
4344
} else {
4445
basicID := uuid.Must(uuid.NewV4()).String()
4546
aexp := info.GetAccessExpiresIn()
@@ -50,11 +51,11 @@ func (rs *TokenStore) Create(info oauth2.TokenInfo) (err error) {
5051
if aexp.Seconds() > rexp.Seconds() {
5152
aexp = rexp
5253
}
53-
pipe.Set(refresh, basicID, rexp)
54+
pipe.Set(rs.KeyNamespace+refresh, basicID, rexp)
5455
}
5556

56-
pipe.Set(info.GetAccess(), basicID, aexp)
57-
pipe.Set(basicID, jv, rexp)
57+
pipe.Set(rs.KeyNamespace+info.GetAccess(), basicID, aexp)
58+
pipe.Set(rs.KeyNamespace+basicID, jv, rexp)
5859
}
5960

6061
if _, verr := pipe.Exec(); verr != nil {
@@ -65,7 +66,7 @@ func (rs *TokenStore) Create(info oauth2.TokenInfo) (err error) {
6566

6667
// remove
6768
func (rs *TokenStore) remove(key string) (err error) {
68-
_, verr := rs.cli.Del(key).Result()
69+
_, verr := rs.cli.Del(rs.KeyNamespace + key).Result()
6970
if verr != redis.Nil {
7071
err = verr
7172
}
@@ -91,7 +92,7 @@ func (rs *TokenStore) RemoveByRefresh(refresh string) (err error) {
9192
}
9293

9394
func (rs *TokenStore) getData(key string) (ti oauth2.TokenInfo, err error) {
94-
result := rs.cli.Get(key)
95+
result := rs.cli.Get(rs.KeyNamespace + key)
9596
if verr := result.Err(); verr != nil {
9697
if verr == redis.Nil {
9798
return
@@ -113,7 +114,7 @@ func (rs *TokenStore) getData(key string) (ti oauth2.TokenInfo, err error) {
113114
}
114115

115116
func (rs *TokenStore) getBasicID(token string) (basicID string, err error) {
116-
tv, verr := rs.cli.Get(token).Result()
117+
tv, verr := rs.cli.Get(rs.KeyNamespace + token).Result()
117118
if verr != nil {
118119
if verr == redis.Nil {
119120
return

token_test.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,92 @@ func TestTokenStore(t *testing.T) {
9797
})
9898
})
9999
}
100+
101+
func TestTokenStoreWithKeyNamespace(t *testing.T) {
102+
Convey("Test redis token store", t, func() {
103+
cfg := &redis.Config{
104+
Addr: "127.0.0.1:6379",
105+
KeyNamespace: "test:",
106+
}
107+
store, err := redis.NewTokenStore(cfg)
108+
So(err, ShouldBeNil)
109+
110+
Convey("Test authorization code store", func() {
111+
info := &models.Token{
112+
ClientID: "1",
113+
UserID: "1_1",
114+
RedirectURI: "http://localhost/",
115+
Scope: "all",
116+
Code: "11_11_11",
117+
CodeCreateAt: time.Now(),
118+
CodeExpiresIn: time.Second * 5,
119+
}
120+
err := store.Create(info)
121+
So(err, ShouldBeNil)
122+
123+
cinfo, err := store.GetByCode(info.Code)
124+
So(err, ShouldBeNil)
125+
So(cinfo.GetUserID(), ShouldEqual, info.UserID)
126+
127+
err = store.RemoveByCode(info.Code)
128+
So(err, ShouldBeNil)
129+
130+
cinfo, err = store.GetByCode(info.Code)
131+
So(err, ShouldBeNil)
132+
So(cinfo, ShouldBeNil)
133+
})
134+
135+
Convey("Test access token store", func() {
136+
info := &models.Token{
137+
ClientID: "1",
138+
UserID: "1_1",
139+
RedirectURI: "http://localhost/",
140+
Scope: "all",
141+
Access: "1_1_1",
142+
AccessCreateAt: time.Now(),
143+
AccessExpiresIn: time.Second * 5,
144+
}
145+
err := store.Create(info)
146+
So(err, ShouldBeNil)
147+
148+
ainfo, err := store.GetByAccess(info.GetAccess())
149+
So(err, ShouldBeNil)
150+
So(ainfo.GetUserID(), ShouldEqual, info.GetUserID())
151+
152+
err = store.RemoveByAccess(info.GetAccess())
153+
So(err, ShouldBeNil)
154+
155+
ainfo, err = store.GetByAccess(info.GetAccess())
156+
So(err, ShouldBeNil)
157+
So(ainfo, ShouldBeNil)
158+
})
159+
160+
Convey("Test refresh token store", func() {
161+
info := &models.Token{
162+
ClientID: "1",
163+
UserID: "1_2",
164+
RedirectURI: "http://localhost/",
165+
Scope: "all",
166+
Access: "1_2_1",
167+
AccessCreateAt: time.Now(),
168+
AccessExpiresIn: time.Second * 5,
169+
Refresh: "1_2_2",
170+
RefreshCreateAt: time.Now(),
171+
RefreshExpiresIn: time.Second * 15,
172+
}
173+
err := store.Create(info)
174+
So(err, ShouldBeNil)
175+
176+
rinfo, err := store.GetByRefresh(info.GetRefresh())
177+
So(err, ShouldBeNil)
178+
So(rinfo.GetUserID(), ShouldEqual, info.GetUserID())
179+
180+
err = store.RemoveByRefresh(info.GetRefresh())
181+
So(err, ShouldBeNil)
182+
183+
rinfo, err = store.GetByRefresh(info.GetRefresh())
184+
So(err, ShouldBeNil)
185+
So(rinfo, ShouldBeNil)
186+
})
187+
})
188+
}

0 commit comments

Comments
 (0)