@@ -173,12 +173,103 @@ func TestRefreshFlow_HandleTokenEndpointRequest(t *testing.T) {
173173 assert .NotEqual (t , sess , areq .Session )
174174 assert .NotEqual (t , time .Now ().UTC ().Add (- time .Hour ).Round (time .Hour ), areq .RequestedAt )
175175 assert .Equal (t , fosite.Arguments {"foo" , "offline" }, areq .GrantedScope )
176- assert .Equal (t , fosite.Arguments {"foo" , "bar" , " offline" }, areq .RequestedScope )
176+ assert .Equal (t , fosite.Arguments {"foo" , "offline" }, areq .RequestedScope )
177177 assert .NotEqual (t , url.Values {"foo" : []string {"bar" }}, areq .Form )
178178 assert .Equal (t , time .Now ().Add (time .Hour ).UTC ().Round (time .Second ), areq .GetSession ().GetExpiresAt (fosite .AccessToken ))
179179 assert .Equal (t , time .Now ().Add (time .Hour ).UTC ().Round (time .Second ), areq .GetSession ().GetExpiresAt (fosite .RefreshToken ))
180180 },
181181 },
182+ {
183+ description : "should pass with scope in form" ,
184+ setup : func (config * fosite.Config ) {
185+ areq .GrantTypes = fosite.Arguments {"refresh_token" }
186+ areq .Client = & fosite.DefaultClient {
187+ ID : "foo" ,
188+ GrantTypes : fosite.Arguments {"refresh_token" },
189+ Scopes : []string {"foo" , "bar" , "baz" , "offline" },
190+ }
191+
192+ token , sig , err := strategy .GenerateRefreshToken (nil , nil )
193+ require .NoError (t , err )
194+
195+ areq .Form .Add ("refresh_token" , token )
196+ areq .Form .Add ("scope" , "foo bar baz offline" )
197+ err = store .CreateRefreshTokenSession (nil , sig , & fosite.Request {
198+ Client : areq .Client ,
199+ GrantedScope : fosite.Arguments {"foo" , "bar" , "baz" , "offline" },
200+ RequestedScope : fosite.Arguments {"foo" , "bar" , "baz" , "offline" },
201+ Session : sess ,
202+ Form : url.Values {"foo" : []string {"bar" }},
203+ RequestedAt : time .Now ().UTC ().Add (- time .Hour ).Round (time .Hour ),
204+ })
205+ require .NoError (t , err )
206+ },
207+ expect : func (t * testing.T ) {
208+ assert .Equal (t , fosite.Arguments {"foo" , "bar" , "baz" , "offline" }, areq .GrantedScope )
209+ assert .Equal (t , fosite.Arguments {"foo" , "bar" , "baz" , "offline" }, areq .RequestedScope )
210+ },
211+ },
212+ {
213+ description : "should pass with scope in form and should narrow scopes" ,
214+ setup : func (config * fosite.Config ) {
215+ areq .GrantTypes = fosite.Arguments {"refresh_token" }
216+ areq .Client = & fosite.DefaultClient {
217+ ID : "foo" ,
218+ GrantTypes : fosite.Arguments {"refresh_token" },
219+ Scopes : []string {"foo" , "bar" , "baz" , "offline" },
220+ }
221+
222+ token , sig , err := strategy .GenerateRefreshToken (nil , nil )
223+ require .NoError (t , err )
224+
225+ areq .Form .Add ("refresh_token" , token )
226+ areq .Form .Add ("scope" , "foo bar offline" )
227+ areq .SetRequestedScopes (fosite.Arguments {"foo" , "bar" , "offline" })
228+
229+ err = store .CreateRefreshTokenSession (nil , sig , & fosite.Request {
230+ Client : areq .Client ,
231+ GrantedScope : fosite.Arguments {"foo" , "bar" , "baz" , "offline" },
232+ RequestedScope : fosite.Arguments {"foo" , "bar" , "baz" , "offline" },
233+ Session : sess ,
234+ Form : url.Values {"foo" : []string {"bar" }},
235+ RequestedAt : time .Now ().UTC ().Add (- time .Hour ).Round (time .Hour ),
236+ })
237+ require .NoError (t , err )
238+ },
239+ expect : func (t * testing.T ) {
240+ assert .Equal (t , fosite.Arguments {"foo" , "bar" , "offline" }, areq .GrantedScope )
241+ assert .Equal (t , fosite.Arguments {"foo" , "bar" , "offline" }, areq .RequestedScope )
242+ },
243+ },
244+ {
245+ description : "should fail with broadened scopes even if the client can request it" ,
246+ setup : func (config * fosite.Config ) {
247+ areq .GrantTypes = fosite.Arguments {"refresh_token" }
248+ areq .Client = & fosite.DefaultClient {
249+ ID : "foo" ,
250+ GrantTypes : fosite.Arguments {"refresh_token" },
251+ Scopes : []string {"foo" , "bar" , "baz" , "offline" },
252+ }
253+
254+ token , sig , err := strategy .GenerateRefreshToken (nil , nil )
255+ require .NoError (t , err )
256+
257+ areq .Form .Add ("refresh_token" , token )
258+ areq .Form .Add ("scope" , "foo bar offline" )
259+ areq .SetRequestedScopes (fosite.Arguments {"foo" , "bar" , "offline" })
260+
261+ err = store .CreateRefreshTokenSession (nil , sig , & fosite.Request {
262+ Client : areq .Client ,
263+ GrantedScope : fosite.Arguments {"foo" , "baz" , "offline" },
264+ RequestedScope : fosite.Arguments {"foo" , "baz" , "offline" },
265+ Session : sess ,
266+ Form : url.Values {"foo" : []string {"bar" }},
267+ RequestedAt : time .Now ().UTC ().Add (- time .Hour ).Round (time .Hour ),
268+ })
269+ require .NoError (t , err )
270+ },
271+ expectErr : fosite .ErrInvalidScope ,
272+ },
182273 {
183274 description : "should pass with custom client lifespans" ,
184275 setup : func (config * fosite.Config ) {
@@ -211,7 +302,7 @@ func TestRefreshFlow_HandleTokenEndpointRequest(t *testing.T) {
211302 assert .NotEqual (t , sess , areq .Session )
212303 assert .NotEqual (t , time .Now ().UTC ().Add (- time .Hour ).Round (time .Hour ), areq .RequestedAt )
213304 assert .Equal (t , fosite.Arguments {"foo" , "offline" }, areq .GrantedScope )
214- assert .Equal (t , fosite.Arguments {"foo" , "bar" , " offline" }, areq .RequestedScope )
305+ assert .Equal (t , fosite.Arguments {"foo" , "offline" }, areq .RequestedScope )
215306 assert .NotEqual (t , url.Values {"foo" : []string {"bar" }}, areq .Form )
216307 internal .RequireEqualTime (t , time .Now ().Add (* internal .TestLifespans .RefreshTokenGrantAccessTokenLifespan ).UTC (), areq .GetSession ().GetExpiresAt (fosite .AccessToken ), time .Minute )
217308 internal .RequireEqualTime (t , time .Now ().Add (* internal .TestLifespans .RefreshTokenGrantRefreshTokenLifespan ).UTC (), areq .GetSession ().GetExpiresAt (fosite .RefreshToken ), time .Minute )
@@ -272,7 +363,7 @@ func TestRefreshFlow_HandleTokenEndpointRequest(t *testing.T) {
272363 assert .NotEqual (t , sess , areq .Session )
273364 assert .NotEqual (t , time .Now ().UTC ().Add (- time .Hour ).Round (time .Hour ), areq .RequestedAt )
274365 assert .Equal (t , fosite.Arguments {"foo" }, areq .GrantedScope )
275- assert .Equal (t , fosite.Arguments {"foo" , "bar" }, areq .RequestedScope )
366+ assert .Equal (t , fosite.Arguments {"foo" }, areq .RequestedScope )
276367 assert .NotEqual (t , url.Values {"foo" : []string {"bar" }}, areq .Form )
277368 assert .Equal (t , time .Now ().Add (time .Hour ).UTC ().Round (time .Second ), areq .GetSession ().GetExpiresAt (fosite .AccessToken ))
278369 assert .Equal (t , time .Now ().Add (time .Hour ).UTC ().Round (time .Second ), areq .GetSession ().GetExpiresAt (fosite .RefreshToken ))
0 commit comments