Skip to content

Commit ebe017a

Browse files
committed
Allow refresh tokens that never expire
If the expiration duration is set to zero, the refresh tokens never expire.
1 parent e3a3000 commit ebe017a

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

manage/manage_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ func TestManager(t *testing.T) {
4141
Convey("Token test", func() {
4242
testManager(tgr, manager)
4343
})
44+
45+
Convey("Token zero expire refresh test", func() {
46+
testZeroRefreshExpirationManager(tgr, manager)
47+
})
4448
})
4549
}
4650

@@ -107,3 +111,38 @@ func testManager(tgr *oauth2.TokenGenerateRequest, manager oauth2.Manager) {
107111
_, err = manager.LoadRefreshToken(refreshToken)
108112
So(err, ShouldNotBeNil)
109113
}
114+
115+
func testZeroRefreshExpirationManager(tgr *oauth2.TokenGenerateRequest, manager oauth2.Manager) {
116+
config := manage.Config{
117+
RefreshTokenExp: 0, // Set explicitly as we're testing 0 (no) expiration
118+
IsGenerateRefresh: true,
119+
}
120+
m, ok := manager.(*manage.Manager)
121+
So(ok, ShouldBeTrue)
122+
m.SetAuthorizeCodeTokenCfg(&config)
123+
124+
cti, err := manager.GenerateAuthToken(oauth2.Code, tgr)
125+
So(err, ShouldBeNil)
126+
127+
code := cti.GetCode()
128+
So(code, ShouldNotBeEmpty)
129+
130+
atParams := &oauth2.TokenGenerateRequest{
131+
ClientID: tgr.ClientID,
132+
ClientSecret: "11",
133+
RedirectURI: tgr.RedirectURI,
134+
Code: code,
135+
}
136+
ati, err := manager.GenerateAccessToken(oauth2.AuthorizationCode, atParams)
137+
So(err, ShouldBeNil)
138+
139+
accessToken, refreshToken := ati.GetAccess(), ati.GetRefresh()
140+
So(accessToken, ShouldNotBeEmpty)
141+
So(refreshToken, ShouldNotBeEmpty)
142+
143+
tokenInfo, err := manager.LoadRefreshToken(refreshToken)
144+
So(err, ShouldBeNil)
145+
So(tokenInfo, ShouldNotBeNil)
146+
So(tokenInfo.GetRefresh(), ShouldEqual, refreshToken)
147+
So(tokenInfo.GetRefreshExpiresIn(), ShouldEqual, 0)
148+
}

manage/manager.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,8 @@ func (m *Manager) LoadRefreshToken(refresh string) (info oauth2.TokenInfo, err e
489489
} else if ti == nil || ti.GetRefresh() != refresh {
490490
err = errors.ErrInvalidRefreshToken
491491
return
492-
} else if ti.GetRefreshCreateAt().Add(ti.GetRefreshExpiresIn()).Before(time.Now()) {
492+
} else if ti.GetRefreshExpiresIn() != 0 && // refresh token set to not expire
493+
ti.GetRefreshCreateAt().Add(ti.GetRefreshExpiresIn()).Before(time.Now()) {
493494
err = errors.ErrExpiredRefreshToken
494495
return
495496
}

store/token.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,19 @@ func (ts *TokenStore) Create(info oauth2.TokenInfo) (err error) {
4747
basicID := uuid.Must(uuid.NewRandom()).String()
4848
aexp := info.GetAccessExpiresIn()
4949
rexp := aexp
50+
expires := true
5051
if refresh := info.GetRefresh(); refresh != "" {
5152
rexp = info.GetRefreshCreateAt().Add(info.GetRefreshExpiresIn()).Sub(ct)
5253
if aexp.Seconds() > rexp.Seconds() {
5354
aexp = rexp
5455
}
55-
_, _, err = tx.Set(refresh, basicID, &buntdb.SetOptions{Expires: true, TTL: rexp})
56+
expires = info.GetRefreshExpiresIn() != 0
57+
_, _, err = tx.Set(refresh, basicID, &buntdb.SetOptions{Expires: expires, TTL: rexp})
5658
if err != nil {
5759
return
5860
}
5961
}
60-
_, _, err = tx.Set(basicID, string(jv), &buntdb.SetOptions{Expires: true, TTL: rexp})
62+
_, _, err = tx.Set(basicID, string(jv), &buntdb.SetOptions{Expires: expires, TTL: rexp})
6163
if err != nil {
6264
return
6365
}

0 commit comments

Comments
 (0)