@@ -8,6 +8,14 @@ import (
8
8
"testing"
9
9
"time"
10
10
11
+ "github.com/golang-jwt/jwt/v4"
12
+
13
+ "github.com/google/uuid"
14
+
15
+ "github.com/coreos/go-oidc/v3/oidc"
16
+
17
+ "github.com/coder/coder/v2/coderd/coderdtest/oidctest"
18
+
11
19
"github.com/stretchr/testify/require"
12
20
"golang.org/x/oauth2"
13
21
"golang.org/x/xerrors"
@@ -22,17 +30,82 @@ import (
22
30
23
31
func TestRefreshToken (t * testing.T ) {
24
32
t .Parallel ()
25
- t .Run ("FalseIfNoRefresh" , func (t * testing.T ) {
33
+ const providerID = "test-idp"
34
+ expired := time .Now ().Add (time .Hour * - 1 )
35
+ t .Run ("NoRefreshExpired" , func (t * testing.T ) {
26
36
t .Parallel ()
37
+
38
+ fake := oidctest .NewFakeIDP (t ,
39
+ // The IDP should not be contacted since the token is expired. An expired
40
+ // token with 'NoRefresh' should early abort.
41
+ oidctest .WithRefreshHook (func (_ string ) error {
42
+ t .Error ("refresh on the IDP was called, but NoRefresh was set" )
43
+ return xerrors .New ("should not be called" )
44
+ }),
45
+ oidctest .WithDynamicUserInfo (func (_ string ) jwt.MapClaims {
46
+ t .Error ("token was validated, but it was expired and this should never have happened." )
47
+ return nil
48
+ }),
49
+ )
50
+
51
+ ctx := oidc .ClientContext (context .Background (), fake .HTTPClient (nil ))
27
52
config := & gitauth.Config {
28
- NoRefresh : true ,
53
+ ID : providerID ,
54
+ OAuth2Config : fake .OIDCConfig (t , nil ),
55
+ NoRefresh : true ,
56
+ ValidateURL : fake .WellknownConfig ().UserInfoURL ,
29
57
}
30
- _ , refreshed , err := config .RefreshToken (context .Background (), nil , database.GitAuthLink {
31
- OAuthExpiry : time.Time {},
58
+ _ , refreshed , err := config .RefreshToken (ctx , nil , database.GitAuthLink {
59
+ ProviderID : providerID ,
60
+ UserID : uuid .New (),
61
+ OAuthAccessToken : uuid .NewString (),
62
+ OAuthRefreshToken : uuid .NewString (),
63
+ OAuthExpiry : expired ,
32
64
})
33
65
require .NoError (t , err )
34
66
require .False (t , refreshed )
35
67
})
68
+ t .Run ("NoRefreshNoExpiry" , func (t * testing.T ) {
69
+ t .Parallel ()
70
+
71
+ validated := false
72
+ fake := oidctest .NewFakeIDP (t ,
73
+ // The IDP should not be contacted since the token is expired. An expired
74
+ // token with 'NoRefresh' should early abort.
75
+ oidctest .WithRefreshHook (func (_ string ) error {
76
+ t .Error ("refresh on the IDP was called, but NoRefresh was set" )
77
+ return xerrors .New ("should not be called" )
78
+ }),
79
+ oidctest .WithDynamicUserInfo (func (_ string ) jwt.MapClaims {
80
+ validated = true
81
+ return jwt.MapClaims {}
82
+ }),
83
+ )
84
+
85
+ ctx := oidc .ClientContext (context .Background (), fake .HTTPClient (nil ))
86
+ config := & gitauth.Config {
87
+ ID : providerID ,
88
+ OAuth2Config : fake .OIDCConfig (t , nil ),
89
+ NoRefresh : true ,
90
+ ValidateURL : fake .WellknownConfig ().UserInfoURL ,
91
+ }
92
+
93
+ token , err := fake .GenerateAuthenticatedToken (jwt.MapClaims {})
94
+ require .NoError (t , err )
95
+
96
+ _ , refreshed , err := config .RefreshToken (ctx , nil , database.GitAuthLink {
97
+ ProviderID : providerID ,
98
+ UserID : uuid .New (),
99
+ OAuthAccessToken : token .AccessToken ,
100
+ // Pass a refresh token, but this should be ignored in this test!
101
+ OAuthRefreshToken : token .RefreshToken ,
102
+ // Zero time used
103
+ OAuthExpiry : time.Time {},
104
+ })
105
+ require .NoError (t , err )
106
+ require .True (t , refreshed , "token without expiry is always valid" )
107
+ require .True (t , validated , "token should have been validated" )
108
+ })
36
109
t .Run ("FalseIfTokenSourceFails" , func (t * testing.T ) {
37
110
t .Parallel ()
38
111
config := & gitauth.Config {
@@ -42,7 +115,9 @@ func TestRefreshToken(t *testing.T) {
42
115
},
43
116
},
44
117
}
45
- _ , refreshed , err := config .RefreshToken (context .Background (), nil , database.GitAuthLink {})
118
+ _ , refreshed , err := config .RefreshToken (context .Background (), nil , database.GitAuthLink {
119
+ OAuthExpiry : expired ,
120
+ })
46
121
require .NoError (t , err )
47
122
require .False (t , refreshed )
48
123
})
@@ -56,7 +131,9 @@ func TestRefreshToken(t *testing.T) {
56
131
OAuth2Config : & testutil.OAuth2Config {},
57
132
ValidateURL : srv .URL ,
58
133
}
59
- _ , _ , err := config .RefreshToken (context .Background (), nil , database.GitAuthLink {})
134
+ _ , _ , err := config .RefreshToken (context .Background (), nil , database.GitAuthLink {
135
+ OAuthExpiry : expired ,
136
+ })
60
137
require .ErrorContains (t , err , "Failure" )
61
138
})
62
139
t .Run ("ValidateFailure" , func (t * testing.T ) {
@@ -69,7 +146,9 @@ func TestRefreshToken(t *testing.T) {
69
146
OAuth2Config : & testutil.OAuth2Config {},
70
147
ValidateURL : srv .URL ,
71
148
}
72
- _ , refreshed , err := config .RefreshToken (context .Background (), nil , database.GitAuthLink {})
149
+ _ , refreshed , err := config .RefreshToken (context .Background (), nil , database.GitAuthLink {
150
+ OAuthExpiry : expired ,
151
+ })
73
152
require .NoError (t , err )
74
153
require .False (t , refreshed )
75
154
})
@@ -100,6 +179,7 @@ func TestRefreshToken(t *testing.T) {
100
179
link := dbgen .GitAuthLink (t , db , database.GitAuthLink {
101
180
ProviderID : config .ID ,
102
181
OAuthAccessToken : "initial" ,
182
+ OAuthExpiry : expired ,
103
183
})
104
184
_ , refreshed , err := config .RefreshToken (context .Background (), db , link )
105
185
require .NoError (t , err )
@@ -124,6 +204,7 @@ func TestRefreshToken(t *testing.T) {
124
204
}
125
205
_ , valid , err := config .RefreshToken (context .Background (), nil , database.GitAuthLink {
126
206
OAuthAccessToken : accessToken ,
207
+ OAuthExpiry : expired ,
127
208
})
128
209
require .NoError (t , err )
129
210
require .True (t , valid )
@@ -143,6 +224,7 @@ func TestRefreshToken(t *testing.T) {
143
224
link := dbgen .GitAuthLink (t , db , database.GitAuthLink {
144
225
ProviderID : config .ID ,
145
226
OAuthAccessToken : "initial" ,
227
+ OAuthExpiry : expired ,
146
228
})
147
229
_ , valid , err := config .RefreshToken (context .Background (), db , link )
148
230
require .NoError (t , err )
0 commit comments