11import 'dart:async' ;
22import 'dart:convert' ;
33import 'dart:math' ;
4- import 'dart:typed_data' ;
54
65import 'package:collection/collection.dart' ;
6+ import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart' ;
77import 'package:gotrue/gotrue.dart' ;
88import 'package:gotrue/src/constants.dart' ;
99import 'package:gotrue/src/fetch.dart' ;
@@ -14,7 +14,6 @@ import 'package:http/http.dart';
1414import 'package:jwt_decode/jwt_decode.dart' ;
1515import 'package:logging/logging.dart' ;
1616import 'package:meta/meta.dart' ;
17- import 'package:pointycastle/export.dart' ;
1817import 'package:retry/retry.dart' ;
1918import 'package:rxdart/subjects.dart' ;
2019
@@ -1342,17 +1341,19 @@ class GoTrueClient {
13421341 return exception;
13431342 }
13441343
1345- Future <JWK ?> _fetchJwk (String kid, JWKSet suppliedJwks) async {
1344+ Future <JWTKey ?> _fetchJwk (String kid, JWKSet suppliedJwks) async {
13461345 // try fetching from the supplied jwks
1347- final jwk = suppliedJwks.keys.firstWhereOrNull ((jwk) => jwk.kid == kid);
1346+ final jwk = suppliedJwks.keys
1347+ .firstWhereOrNull ((jwk) => jwk.toJWK (keyID: kid)['kid' ] == kid);
13481348 if (jwk != null ) {
13491349 return jwk;
13501350 }
13511351
13521352 final now = DateTime .now ();
13531353
13541354 // try fetching from cache
1355- final cachedJwk = _jwks? .keys.firstWhereOrNull ((jwk) => jwk.kid == kid);
1355+ final cachedJwk = _jwks? .keys
1356+ .firstWhereOrNull ((jwk) => jwk.toJWK (keyID: kid)['kid' ] == kid);
13561357
13571358 // jwks exists and it isn't stale
13581359 if (cachedJwk != null &&
@@ -1378,7 +1379,8 @@ class GoTrueClient {
13781379 _jwksCachedAt = now;
13791380
13801381 // find the signing key
1381- return jwks.keys.firstWhereOrNull ((jwk) => jwk.kid == kid);
1382+ return jwks.keys
1383+ .firstWhereOrNull ((jwk) => jwk.toJWK (keyID: kid)['kid' ] == kid);
13821384 }
13831385
13841386 /// Extracts the JWT claims present in the access token by first verifying the
@@ -1431,26 +1433,14 @@ class GoTrueClient {
14311433 signature: decoded.signature);
14321434 }
14331435
1434- final publicKey = RSAPublicKey (signingKey['n' ], signingKey['e' ]);
1435- final signer = RSASigner (SHA256Digest (), '0609608648016503040201' ); // PKCS1
1436-
1437- // initialize with false, which means verify
1438- signer.init (false , PublicKeyParameter <RSAPublicKey >(publicKey));
1439-
1440- final signature = RSASignature (Uint8List .fromList (decoded.signature));
1441- final isValidSignature = signer.verifySignature (
1442- Uint8List .fromList (
1443- utf8.encode ('${decoded .raw .header }.${decoded .raw .payload }' )),
1444- signature,
1445- );
1446-
1447- if (! isValidSignature) {
1448- throw AuthInvalidJwtException ('Invalid JWT signature' );
1436+ try {
1437+ JWT .verify (token, signingKey);
1438+ return GetClaimsResponse (
1439+ claims: decoded.payload,
1440+ header: decoded.header,
1441+ signature: decoded.signature);
1442+ } catch (e) {
1443+ throw AuthInvalidJwtException ('Invalid JWT signature: $e ' );
14491444 }
1450-
1451- return GetClaimsResponse (
1452- claims: decoded.payload,
1453- header: decoded.header,
1454- signature: decoded.signature);
14551445 }
14561446}
0 commit comments