@@ -48,6 +48,7 @@ use serde::Serialize;
48
48
use serde_with:: { serde_as, skip_serializing_none} ;
49
49
use thiserror:: Error ;
50
50
use tracing:: debug;
51
+ use ulid:: Ulid ;
51
52
use url:: Url ;
52
53
53
54
use super :: { generate_id_token, generate_token_pair} ;
@@ -96,6 +97,18 @@ pub(crate) enum RouteError {
96
97
#[ error( "invalid grant" ) ]
97
98
InvalidGrant ,
98
99
100
+ #[ error( "refresh token not found" ) ]
101
+ RefreshTokenNotFound ,
102
+
103
+ #[ error( "refresh token {0} is invalid" ) ]
104
+ RefreshTokenInvalid ( Ulid ) ,
105
+
106
+ #[ error( "session {0} is invalid" ) ]
107
+ SessionInvalid ( Ulid ) ,
108
+
109
+ #[ error( "client id mismatch: expected {expected}, got {actual}" ) ]
110
+ ClientIDMismatch { expected : Ulid , actual : Ulid } ,
111
+
99
112
#[ error( "policy denied the request" ) ]
100
113
DeniedByPolicy ( Vec < mas_policy:: Violation > ) ,
101
114
@@ -152,7 +165,12 @@ impl IntoResponse for RouteError {
152
165
) ,
153
166
) ,
154
167
) ,
155
- Self :: InvalidGrant | Self :: GrantNotFound => (
168
+ Self :: InvalidGrant
169
+ | Self :: RefreshTokenNotFound
170
+ | Self :: RefreshTokenInvalid ( _)
171
+ | Self :: SessionInvalid ( _)
172
+ | Self :: ClientIDMismatch { .. }
173
+ | Self :: GrantNotFound => (
156
174
StatusCode :: BAD_REQUEST ,
157
175
Json ( ClientError :: from ( ClientErrorCode :: InvalidGrant ) ) ,
158
176
) ,
@@ -422,21 +440,28 @@ async fn refresh_token_grant(
422
440
. oauth2_refresh_token ( )
423
441
. find_by_token ( & grant. refresh_token )
424
442
. await ?
425
- . ok_or ( RouteError :: InvalidGrant ) ?;
443
+ . ok_or ( RouteError :: RefreshTokenNotFound ) ?;
426
444
427
445
let session = repo
428
446
. oauth2_session ( )
429
447
. lookup ( refresh_token. session_id )
430
448
. await ?
431
449
. ok_or ( RouteError :: NoSuchOAuthSession ) ?;
432
450
433
- if !refresh_token. is_valid ( ) || !session. is_valid ( ) {
434
- return Err ( RouteError :: InvalidGrant ) ;
451
+ if !refresh_token. is_valid ( ) {
452
+ return Err ( RouteError :: RefreshTokenInvalid ( refresh_token. id ) ) ;
453
+ }
454
+
455
+ if !session. is_valid ( ) {
456
+ return Err ( RouteError :: SessionInvalid ( session. id ) ) ;
435
457
}
436
458
437
459
if client. id != session. client_id {
438
460
// As per https://datatracker.ietf.org/doc/html/rfc6749#section-5.2
439
- return Err ( RouteError :: InvalidGrant ) ;
461
+ return Err ( RouteError :: ClientIDMismatch {
462
+ expected : session. client_id ,
463
+ actual : client. id ,
464
+ } ) ;
440
465
}
441
466
442
467
let ttl = site_config. access_token_ttl ;
0 commit comments