2
2
AbstractValidationHandler ,
3
3
ValidationParams
4
4
} from './validation-handler' ;
5
- import * as jwkToPem from 'jwk-to-pem' ;
6
- import * as jwt from 'jsonwebtoken' ;
7
-
8
5
9
6
/**
10
7
* Validates the signature of an id_token against one
@@ -36,7 +33,10 @@ export class JwksValidationHandler extends AbstractValidationHandler {
36
33
*/
37
34
gracePeriodInSec = 600 ;
38
35
39
- validateSignature ( params : ValidationParams , retry = false ) : Promise < any > {
36
+ private cyptoObj : Crypto = window . crypto || ( window as any ) . msCrypto // for IE11
37
+ private textEncoder = new ( window as any ) . TextEncoder ( ) ;
38
+
39
+ async validateSignature ( params : ValidationParams , retry = false ) : Promise < any > {
40
40
if ( ! params . idToken ) throw new Error ( 'Parameter idToken expected!' ) ;
41
41
if ( ! params . idTokenHeader )
42
42
throw new Error ( 'Parameter idTokenHandler expected.' ) ;
@@ -53,8 +53,8 @@ export class JwksValidationHandler extends AbstractValidationHandler {
53
53
// console.debug('validateSignature: retry', retry);
54
54
55
55
let kid : string = params . idTokenHeader [ 'kid' ] ;
56
- let keys : object [ ] = params . jwks [ 'keys' ] ;
57
- let key : object ;
56
+ let keys : JsonWebKey [ ] = params . jwks [ 'keys' ] ;
57
+ let key : JsonWebKey ;
58
58
59
59
let alg = params . idTokenHeader [ 'alg' ] ;
60
60
@@ -107,17 +107,28 @@ export class JwksValidationHandler extends AbstractValidationHandler {
107
107
return Promise . reject ( error ) ;
108
108
}
109
109
110
- const pem = jwkToPem ( key ) ;
111
- try {
112
- jwt . verify (
113
- params . idToken ,
114
- pem ,
115
- { algorithms : this . allowedAlgorithms , clockTolerance : this . gracePeriodInSec }
116
- ) ;
117
- } catch ( err ) {
110
+ const [ header , body , sig ] = params . idToken . split ( ',' ) ;
111
+
112
+ const cyptokey = await this . cyptoObj . subtle . importKey ( 'jwk' , key as any , alg , true , [ 'verify' ] ) ;
113
+ const isValid = await this . cyptoObj . subtle . verify ( alg , cyptokey , this . textEncoder . encode ( sig ) , this . textEncoder . encode ( body ) ) ;
114
+
115
+ if ( isValid ) {
116
+ return Promise . resolve ( ) ;
117
+ } else {
118
118
return Promise . reject ( 'Signature not valid' ) ;
119
119
}
120
- return Promise . resolve ( ) ;
120
+
121
+ // const pem = jwkToPemAsAny(key);
122
+ // try {
123
+ // jwt.verify(
124
+ // params.idToken,
125
+ // pem,
126
+ // {algorithms: this.allowedAlgorithms, clockTolerance: this.gracePeriodInSec}
127
+ // );
128
+ // } catch (err) {
129
+ // return Promise.reject('Signature not valid');
130
+ // }
131
+ // return Promise.resolve();
121
132
}
122
133
123
134
private alg2kty ( alg : string ) {
@@ -132,9 +143,8 @@ export class JwksValidationHandler extends AbstractValidationHandler {
132
143
}
133
144
134
145
async calcHash ( valueToHash : string , algorithm : string ) : Promise < string > {
135
- const encoder = new TextEncoder ( ) ;
136
- const valueAsBytes = encoder . encode ( valueToHash ) ;
137
- const resultBytes = await window . crypto . subtle . digest ( algorithm , valueAsBytes ) ;
146
+ const valueAsBytes = this . textEncoder . encode ( valueToHash ) ;
147
+ const resultBytes = await this . cyptoObj . subtle . digest ( algorithm , valueAsBytes ) ;
138
148
// the returned bytes are encoded as UTF-16
139
149
return String . fromCharCode . apply ( null , new Uint16Array ( resultBytes ) ) ;
140
150
}
0 commit comments