@@ -23,7 +23,7 @@ export class JoseUtil {
2323 }
2424 }
2525
26- static validateJwt ( jwt , key , issuer , audience , clockSkew , now ) {
26+ static validateJwt ( jwt , key , issuer , audience , clockSkew , now , timeInsensitive ) {
2727 Log . debug ( "JoseUtil.validateJwt" ) ;
2828
2929 try {
@@ -54,15 +54,15 @@ export class JoseUtil {
5454 return Promise . reject ( new Error ( "Unsupported key type: " + key && key . kty ) ) ;
5555 }
5656
57- return JoseUtil . _validateJwt ( jwt , key , issuer , audience , clockSkew , now ) ;
57+ return JoseUtil . _validateJwt ( jwt , key , issuer , audience , clockSkew , now , timeInsensitive ) ;
5858 }
5959 catch ( e ) {
6060 Log . error ( e && e . message || e ) ;
6161 return Promise . reject ( "JWT validation failed" ) ;
6262 }
6363 }
6464
65- static validateJwtAttributes ( jwt , issuer , audience , clockSkew , now ) {
65+ static validateJwtAttributes ( jwt , issuer , audience , clockSkew , now , timeInsensitive ) {
6666 if ( ! clockSkew ) {
6767 clockSkew = 0 ;
6868 }
@@ -96,38 +96,40 @@ export class JoseUtil {
9696 return Promise . reject ( new Error ( "Invalid azp in token: " + payload . azp ) ) ;
9797 }
9898
99- var lowerNow = now + clockSkew ;
100- var upperNow = now - clockSkew ;
99+ if ( ! timeInsensitive ) {
100+ var lowerNow = now + clockSkew ;
101+ var upperNow = now - clockSkew ;
101102
102- if ( ! payload . iat ) {
103- Log . error ( "JoseUtil._validateJwt: iat was not provided" ) ;
104- return Promise . reject ( new Error ( "iat was not provided" ) ) ;
105- }
106- if ( lowerNow < payload . iat ) {
107- Log . error ( "JoseUtil._validateJwt: iat is in the future" , payload . iat ) ;
108- return Promise . reject ( new Error ( "iat is in the future: " + payload . iat ) ) ;
109- }
103+ if ( ! payload . iat ) {
104+ Log . error ( "JoseUtil._validateJwt: iat was not provided" ) ;
105+ return Promise . reject ( new Error ( "iat was not provided" ) ) ;
106+ }
107+ if ( lowerNow < payload . iat ) {
108+ Log . error ( "JoseUtil._validateJwt: iat is in the future" , payload . iat ) ;
109+ return Promise . reject ( new Error ( "iat is in the future: " + payload . iat ) ) ;
110+ }
110111
111- if ( payload . nbf && lowerNow < payload . nbf ) {
112- Log . error ( "JoseUtil._validateJwt: nbf is in the future" , payload . nbf ) ;
113- return Promise . reject ( new Error ( "nbf is in the future: " + payload . nbf ) ) ;
114- }
112+ if ( payload . nbf && lowerNow < payload . nbf ) {
113+ Log . error ( "JoseUtil._validateJwt: nbf is in the future" , payload . nbf ) ;
114+ return Promise . reject ( new Error ( "nbf is in the future: " + payload . nbf ) ) ;
115+ }
115116
116- if ( ! payload . exp ) {
117- Log . error ( "JoseUtil._validateJwt: exp was not provided" ) ;
118- return Promise . reject ( new Error ( "exp was not provided" ) ) ;
119- }
120- if ( payload . exp < upperNow ) {
121- Log . error ( "JoseUtil._validateJwt: exp is in the past" , payload . exp ) ;
122- return Promise . reject ( new Error ( "exp is in the past:" + payload . exp ) ) ;
117+ if ( ! payload . exp ) {
118+ Log . error ( "JoseUtil._validateJwt: exp was not provided" ) ;
119+ return Promise . reject ( new Error ( "exp was not provided" ) ) ;
120+ }
121+ if ( payload . exp < upperNow ) {
122+ Log . error ( "JoseUtil._validateJwt: exp is in the past" , payload . exp ) ;
123+ return Promise . reject ( new Error ( "exp is in the past:" + payload . exp ) ) ;
124+ }
123125 }
124126
125127 return Promise . resolve ( payload ) ;
126128 }
127129
128- static _validateJwt ( jwt , key , issuer , audience , clockSkew , now ) {
130+ static _validateJwt ( jwt , key , issuer , audience , clockSkew , now , timeInsensitive ) {
129131
130- return JoseUtil . validateJwtAttributes ( jwt , issuer , audience , clockSkew , now ) . then ( payload => {
132+ return JoseUtil . validateJwtAttributes ( jwt , issuer , audience , clockSkew , now , timeInsensitive ) . then ( payload => {
131133 try {
132134 if ( ! jws . JWS . verify ( jwt , key , AllowedSigningAlgs ) ) {
133135 Log . error ( "JoseUtil._validateJwt: signature validation failed" ) ;
0 commit comments