Skip to content

Commit 361af40

Browse files
committed
apply fixes of upstream repo PR firebase#58
1 parent 21f5625 commit 361af40

File tree

3 files changed

+86
-25
lines changed

3 files changed

+86
-25
lines changed

packages/dart_firebase_admin/lib/src/auth/token_verifier.dart

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ class FirebaseTokenVerifier {
7979
isEmulator: isEmulator,
8080
);
8181

82-
final decodedIdToken = DecodedIdToken.fromMap(decoded.payload);
83-
decodedIdToken.uid = decodedIdToken.sub;
84-
return decodedIdToken;
82+
return DecodedIdToken.fromMap(decoded.payload);
8583
}
8684

8785
Future<DecodedToken> _decodeAndVerify(
@@ -249,6 +247,17 @@ class TokenProvider {
249247
required this.tenant,
250248
});
251249

250+
@internal
251+
factory TokenProvider.fromMap(Map<dynamic, dynamic> map) {
252+
return TokenProvider(
253+
identities: map['identities']! as Map<String, Object?>,
254+
signInProvider: map['sign_in_provider'] as String?,
255+
signInSecondFactor: map['sign_in_second_factor'] as String?,
256+
secondFactorIdentifier: map['second_factor_identifier'] as String?,
257+
tenant: map['tenant'] as String?,
258+
);
259+
}
260+
252261
/// Provider-specific identity details corresponding
253262
/// to the provider used to sign in the user.
254263
Map<String, Object?> identities;
@@ -262,7 +271,7 @@ class TokenProvider {
262271
/// Additional Identity Platform provider IDs include `"linkedin.com"`,
263272
/// OIDC and SAML identity providers prefixed with `"saml."` and `"oidc."`
264273
/// respectively.
265-
String signInProvider;
274+
String? signInProvider;
266275

267276
/// The type identifier or `factorId` of the second factor, provided the
268277
/// ID token was obtained from a multi-factor authenticated user.
@@ -313,19 +322,13 @@ class DecodedIdToken {
313322
email: map['email'] as String?,
314323
emailVerified: map['email_verified'] as bool?,
315324
exp: map['exp']! as int,
316-
firebase: TokenProvider(
317-
identities: Map.from(map['firebase']! as Map),
318-
signInProvider: map['sign_in_provider']! as String,
319-
signInSecondFactor: map['sign_in_second_factor'] as String?,
320-
secondFactorIdentifier: map['second_factor_identifier'] as String?,
321-
tenant: map['tenant'] as String?,
322-
),
325+
firebase: TokenProvider.fromMap(map['firebase']! as Map),
323326
iat: map['iat']! as int,
324327
iss: map['iss']! as String,
325328
phoneNumber: map['phone_number'] as String?,
326329
picture: map['picture'] as String?,
327330
sub: map['sub']! as String,
328-
uid: map['uid']! as String,
331+
uid: map['sub']! as String,
329332
);
330333
}
331334

packages/dart_firebase_admin/lib/src/utils/jwt.dart

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ class EmulatorSignatureVerifier implements SignatureVerifier {
99
@override
1010
Future<void> verify(String token) async {
1111
// Signature checks skipped for emulator; no need to fetch public keys.
12+
1213
try {
1314
verifyJwtSignature(
1415
token,
1516
SecretKey(''),
1617
);
1718
} on JWTInvalidException catch (e) {
19+
// Emulator tokens have "alg": "none"
20+
if (e.message == 'unknown algorithm') return;
1821
if (e.message == 'invalid signature') return;
1922
rethrow;
2023
}
@@ -122,11 +125,23 @@ class PublicKeySignatureVerifier implements SignatureVerifier {
122125
'no-matching-kid-error',
123126
);
124127
}
125-
verifyJwtSignature(
126-
token,
127-
RSAPublicKey.cert(publicKey),
128-
issueAt: Duration.zero, // Any past date should be valid
129-
);
128+
129+
try {
130+
verifyJwtSignature(
131+
token,
132+
RSAPublicKey.cert(publicKey),
133+
issueAt: Duration.zero, // Any past date should be valid
134+
);
135+
} catch (e, stackTrace) {
136+
Error.throwWithStackTrace(
137+
JwtError(
138+
JwtErrorCode.invalidSignature,
139+
'Error while verifying signature of Firebase ID token: $e',
140+
),
141+
stackTrace,
142+
);
143+
}
144+
130145
// At this point most JWTException's should have been caught in
131146
// verifyJwtSignature, but we could still get some from JWT.decode above
132147
} on JWTException catch (e) {
@@ -169,14 +184,6 @@ void verifyJwtSignature(
169184
),
170185
stackTrace,
171186
);
172-
} catch (e, stackTrace) {
173-
Error.throwWithStackTrace(
174-
JwtError(
175-
JwtErrorCode.invalidSignature,
176-
'Error while verifying signature of Firebase ID token: $e',
177-
),
178-
stackTrace,
179-
);
180187
}
181188
}
182189

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import 'package:dart_firebase_admin/src/auth.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
group('DecodedIdToken', () {
6+
test('.fromMap', () async {
7+
final idToken = DecodedIdToken.fromMap(
8+
{
9+
'aud': 'mock-aud',
10+
'auth_time': 1,
11+
'email': 'mock-email',
12+
'email_verified': true,
13+
'exp': 1,
14+
'firebase': {
15+
'identities': {
16+
'email': 'mock-email',
17+
},
18+
'sign_in_provider': 'mock-sign-in-provider',
19+
'sign_in_second_factor': 'mock-sign-in-second-factor',
20+
'second_factor_identifier': 'mock-second-factor-identifier',
21+
'tenant': 'mock-tenant',
22+
},
23+
'iat': 1,
24+
'iss': 'mock-iss',
25+
'phone_number': 'mock-phone-number',
26+
'picture': 'mock-picture',
27+
'sub': 'mock-sub',
28+
},
29+
);
30+
expect(idToken.aud, 'mock-aud');
31+
expect(idToken.authTime, DateTime.fromMillisecondsSinceEpoch(1000));
32+
expect(idToken.email, 'mock-email');
33+
expect(idToken.emailVerified, true);
34+
expect(idToken.exp, 1);
35+
expect(idToken.firebase.identities, {'email': 'mock-email'});
36+
expect(idToken.firebase.signInProvider, 'mock-sign-in-provider');
37+
expect(idToken.firebase.signInSecondFactor, 'mock-sign-in-second-factor');
38+
expect(
39+
idToken.firebase.secondFactorIdentifier,
40+
'mock-second-factor-identifier',
41+
);
42+
expect(idToken.firebase.tenant, 'mock-tenant');
43+
expect(idToken.iat, 1);
44+
expect(idToken.iss, 'mock-iss');
45+
expect(idToken.phoneNumber, 'mock-phone-number');
46+
expect(idToken.picture, 'mock-picture');
47+
expect(idToken.sub, 'mock-sub');
48+
expect(idToken.uid, 'mock-sub');
49+
});
50+
});
51+
}

0 commit comments

Comments
 (0)