44import { Log } from './Log' ;
55import { MetadataService } from './MetadataService' ;
66import { UserInfoService } from './UserInfoService' ;
7+ import { TokenClient } from './TokenClient' ;
78import { ErrorResponse } from './ErrorResponse' ;
89import { JoseUtil } from './JoseUtil' ;
910
1011const ProtocolClaims = [ "nonce" , "at_hash" , "iat" , "nbf" , "exp" , "aud" , "iss" , "c_hash" ] ;
1112
1213export class ResponseValidator {
1314
14- constructor ( settings , MetadataServiceCtor = MetadataService , UserInfoServiceCtor = UserInfoService , joseUtil = JoseUtil ) {
15+ constructor ( settings ,
16+ MetadataServiceCtor = MetadataService ,
17+ UserInfoServiceCtor = UserInfoService ,
18+ joseUtil = JoseUtil ,
19+ TokenClientCtor = TokenClient ) {
1520 if ( ! settings ) {
1621 Log . error ( "ResponseValidator.ctor: No settings passed to ResponseValidator" ) ;
1722 throw new Error ( "settings" ) ;
@@ -21,6 +26,7 @@ export class ResponseValidator {
2126 this . _metadataService = new MetadataServiceCtor ( this . _settings ) ;
2227 this . _userInfoService = new UserInfoServiceCtor ( this . _settings ) ;
2328 this . _joseUtil = joseUtil ;
29+ this . _tokenClient = new TokenClientCtor ( this . _settings ) ;
2430 }
2531
2632 validateSigninResponse ( state , response ) {
@@ -114,6 +120,16 @@ export class ResponseValidator {
114120 return Promise . reject ( new Error ( "Unexpected id_token in response" ) ) ;
115121 }
116122
123+ if ( state . code_verifier && ! response . code ) {
124+ Log . error ( "ResponseValidator._processSigninParams: Expecting code in response" ) ;
125+ return Promise . reject ( new Error ( "No code in response" ) ) ;
126+ }
127+
128+ if ( ! state . code_verifier && response . code ) {
129+ Log . error ( "ResponseValidator._processSigninParams: Not expecting code in response" ) ;
130+ return Promise . reject ( new Error ( "Unexpected code in response" ) ) ;
131+ }
132+
117133 return Promise . resolve ( response ) ;
118134 }
119135
@@ -209,10 +225,27 @@ export class ResponseValidator {
209225 return this . _validateIdToken ( state , response ) ;
210226 }
211227
228+ if ( response . code ) {
229+ Log . debug ( "ResponseValidator._validateTokens: Validating code" ) ;
230+ return this . _validateCode ( state , response ) ;
231+ }
232+
212233 Log . debug ( "ResponseValidator._validateTokens: No id_token to validate" ) ;
213234 return Promise . resolve ( response ) ;
214235 }
215236
237+ _validateCode ( state , response ) {
238+ var args = {
239+ code : response . code ,
240+ redirect_uri : state . redirect_uri ,
241+ code_verifier : state . code_verifier ,
242+ } ;
243+ return this . _tokenClient . exchangeCode ( args ) . then ( tokenResponse => {
244+ response . id_token = tokenResponse . id_token ;
245+ response . access_token = tokenResponse . access_token ;
246+ } ) ;
247+ }
248+
216249 _validateIdTokenAndAccessToken ( state , response ) {
217250 return this . _validateIdToken ( state , response ) . then ( response => {
218251 return this . _validateAccessToken ( response ) ;
0 commit comments