Skip to content

Commit 0a6801e

Browse files
committed
Add the authorization code storage support
1 parent 26118d2 commit 0a6801e

File tree

2 files changed

+84
-19
lines changed

2 files changed

+84
-19
lines changed

token.go

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ func (ts *TokenStore) c(name string) *mgo.Collection {
8181

8282
// Create Create and store the new token information
8383
func (ts *TokenStore) Create(info oauth2.TokenInfo) (err error) {
84+
jv, err := json.Marshal(info)
85+
if err != nil {
86+
return
87+
}
88+
89+
if code := info.GetCode(); code != "" {
90+
err = ts.c(ts.tcfg.BasicCName).Insert(basicData{
91+
ID: code,
92+
Data: jv,
93+
ExpiredAt: info.GetCodeCreateAt().Add(info.GetCodeExpiresIn()),
94+
})
95+
return
96+
}
97+
8498
aexp := info.GetAccessCreateAt().Add(info.GetAccessExpiresIn())
8599
rexp := aexp
86100
if refresh := info.GetRefresh(); refresh != "" {
@@ -90,10 +104,6 @@ func (ts *TokenStore) Create(info oauth2.TokenInfo) (err error) {
90104
}
91105
}
92106
id := bson.NewObjectId().Hex()
93-
jv, err := json.Marshal(info)
94-
if err != nil {
95-
return
96-
}
97107
runner := txn.NewRunner(ts.c(ts.tcfg.TxnCName))
98108
ops := []txn.Op{{
99109
C: ts.tcfg.BasicCName,
@@ -127,9 +137,9 @@ func (ts *TokenStore) Create(info oauth2.TokenInfo) (err error) {
127137
return
128138
}
129139

130-
// RemoveByAccess Use the access token to delete the token information
131-
func (ts *TokenStore) RemoveByAccess(access string) (err error) {
132-
verr := ts.c(ts.tcfg.AccessCName).RemoveId(access)
140+
// RemoveByCode Use the authorization code to delete the token information
141+
func (ts *TokenStore) RemoveByCode(code string) (err error) {
142+
verr := ts.c(ts.tcfg.BasicCName).RemoveId(code)
133143
if verr != nil {
134144
if verr == mgo.ErrNotFound {
135145
return
@@ -139,9 +149,9 @@ func (ts *TokenStore) RemoveByAccess(access string) (err error) {
139149
return
140150
}
141151

142-
// RemoveByRefresh Use the refresh token to delete the token information
143-
func (ts *TokenStore) RemoveByRefresh(refresh string) (err error) {
144-
verr := ts.c(ts.tcfg.RefreshCName).RemoveId(refresh)
152+
// RemoveByAccess Use the access token to delete the token information
153+
func (ts *TokenStore) RemoveByAccess(access string) (err error) {
154+
verr := ts.c(ts.tcfg.AccessCName).RemoveId(access)
145155
if verr != nil {
146156
if verr == mgo.ErrNotFound {
147157
return
@@ -151,19 +161,21 @@ func (ts *TokenStore) RemoveByRefresh(refresh string) (err error) {
151161
return
152162
}
153163

154-
// get
155-
func (ts *TokenStore) get(cname, token string) (ti oauth2.TokenInfo, err error) {
156-
var td tokenData
157-
verr := ts.c(cname).FindId(token).One(&td)
164+
// RemoveByRefresh Use the refresh token to delete the token information
165+
func (ts *TokenStore) RemoveByRefresh(refresh string) (err error) {
166+
verr := ts.c(ts.tcfg.RefreshCName).RemoveId(refresh)
158167
if verr != nil {
159168
if verr == mgo.ErrNotFound {
160169
return
161170
}
162171
err = verr
163-
return
164172
}
173+
return
174+
}
175+
176+
func (ts *TokenStore) getData(basicID string) (ti oauth2.TokenInfo, err error) {
165177
var bd basicData
166-
verr = ts.c(ts.tcfg.BasicCName).FindId(td.BasicID).One(&bd)
178+
verr := ts.c(ts.tcfg.BasicCName).FindId(basicID).One(&bd)
167179
if verr != nil {
168180
if verr == mgo.ErrNotFound {
169181
return
@@ -180,15 +192,43 @@ func (ts *TokenStore) get(cname, token string) (ti oauth2.TokenInfo, err error)
180192
return
181193
}
182194

195+
func (ts *TokenStore) getBasicID(cname, token string) (basicID string, err error) {
196+
var td tokenData
197+
verr := ts.c(cname).FindId(token).One(&td)
198+
if verr != nil {
199+
if verr == mgo.ErrNotFound {
200+
return
201+
}
202+
err = verr
203+
return
204+
}
205+
basicID = td.BasicID
206+
return
207+
}
208+
209+
// GetByCode Use the authorization code for token information data
210+
func (ts *TokenStore) GetByCode(code string) (ti oauth2.TokenInfo, err error) {
211+
ti, err = ts.getData(code)
212+
return
213+
}
214+
183215
// GetByAccess Use the access token for token information data
184216
func (ts *TokenStore) GetByAccess(access string) (ti oauth2.TokenInfo, err error) {
185-
ti, err = ts.get(ts.tcfg.AccessCName, access)
217+
basicID, err := ts.getBasicID(ts.tcfg.AccessCName, access)
218+
if err != nil && basicID == "" {
219+
return
220+
}
221+
ti, err = ts.getData(basicID)
186222
return
187223
}
188224

189225
// GetByRefresh Use the refresh token for token information data
190226
func (ts *TokenStore) GetByRefresh(refresh string) (ti oauth2.TokenInfo, err error) {
191-
ti, err = ts.get(ts.tcfg.RefreshCName, refresh)
227+
basicID, err := ts.getBasicID(ts.tcfg.RefreshCName, refresh)
228+
if err != nil && basicID == "" {
229+
return
230+
}
231+
ti, err = ts.getData(basicID)
192232
return
193233
}
194234

token_test.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,31 @@ func TestTokenStore(t *testing.T) {
1616
store, err := mongo.NewTokenStore(mcfg)
1717
So(err, ShouldBeNil)
1818

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

0 commit comments

Comments
 (0)