Skip to content

Commit 02c861e

Browse files
committed
Try to auto refresh on invalid and missing tokens as well
1 parent f16d2ad commit 02c861e

File tree

2 files changed

+51
-17
lines changed

2 files changed

+51
-17
lines changed

models/jwt/JwtService.cfc

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -903,23 +903,28 @@ component accessors="true" singleton threadsafe {
903903
// Access Token Has Expired
904904
catch ( TokenExpiredException e ) {
905905
// Do we have autoRefreshValidator turned on and we have an incoming refresh token?
906-
var refreshToken = discoverRefreshToken();
907-
if ( variables.settings.jwt.enableAutoRefreshValidator && len( refreshToken ) ) {
908-
// Try to Refresh the tokens
909-
var newTokens = this.refreshToken( refreshToken );
910-
// Setup payload + authenticate for current request
911-
payload = parseToken( newTokens.access_token );
912-
// Send back as headers now that they are refreshed
913-
variables.requestService
914-
.getContext()
915-
.setHTTPHeader(
916-
name : variables.settings.jwt.customAuthHeader,
917-
value: newTokens.access_token
918-
)
919-
.setHTTPHeader(
920-
name : variables.settings.jwt.customRefreshHeader,
921-
value: newTokens.refresh_token
922-
);
906+
if ( variables.settings.jwt.enableAutoRefreshValidator && len( discoverRefreshToken() ) ) {
907+
autoRefreshTokens();
908+
} else {
909+
// Error out as normal
910+
results.messages = e.type & ":" & e.message;
911+
return results;
912+
}
913+
}
914+
catch ( TokenInvalidException e ) {
915+
// Do we have autoRefreshValidator turned on and we have an incoming refresh token?
916+
if ( variables.settings.jwt.enableAutoRefreshValidator && len( discoverRefreshToken() ) ) {
917+
autoRefreshTokens();
918+
} else {
919+
// Error out as normal
920+
results.messages = e.type & ":" & e.message;
921+
return results;
922+
}
923+
}
924+
catch ( TokenNotFoundException e ) {
925+
// Do we have autoRefreshValidator turned on and we have an incoming refresh token?
926+
if ( variables.settings.jwt.enableAutoRefreshValidator && len( discoverRefreshToken() ) ) {
927+
autoRefreshTokens();
923928
} else {
924929
// Error out as normal
925930
results.messages = e.type & ":" & e.message;
@@ -952,6 +957,24 @@ component accessors="true" singleton threadsafe {
952957
return results;
953958
}
954959

960+
private function autoRefreshTokens() {
961+
// Try to Refresh the tokens
962+
var newTokens = this.refreshToken( discoverRefreshToken() );
963+
// Setup payload + authenticate for current request
964+
payload = parseToken( newTokens.access_token );
965+
// Send back as headers now that they are refreshed
966+
variables.requestService
967+
.getContext()
968+
.setHTTPHeader(
969+
name : variables.settings.jwt.customAuthHeader,
970+
value: newTokens.access_token
971+
)
972+
.setHTTPHeader(
973+
name : variables.settings.jwt.customRefreshHeader,
974+
value: newTokens.refresh_token
975+
);
976+
}
977+
955978
/**
956979
* Verify if the jwt token has the appropriate scopes
957980
* @permission

test-harness/tests/specs/integration/JWTSpec.cfc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,17 @@ component extends="coldbox.system.testing.BaseTestCase" appMapping="/root" {
6464
expect( results.messages ).toInclude( "TokenNotFoundException" );
6565
} );
6666
} );
67+
given( "Auto refresh is on and no access token is sent but a refresh token is sent", function(){
68+
then( "the validation should pass and we should return our two new tokens as headers", function(){
69+
var oUser = variables.userService.retrieveUserByUsername( "test" );
70+
var tokens = variables.jwtService.fromUser( oUser );
71+
72+
getRequestContext().setValue( "x-refresh-token", tokens.refresh_token );
73+
74+
var results = variables.jwtService.validateSecurity( "" );
75+
expect( results.allow ).toBeTrue();
76+
} );
77+
} );
6778
given( "Auto refresh is on and an expired access token is sent but no refresh token is sent", function(){
6879
then( "the validation should fail", function(){
6980
getRequestContext().setValue( "x-auth-token", variables.expired_token );

0 commit comments

Comments
 (0)