@@ -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 (
@@ -129,6 +127,13 @@ class FirebaseTokenVerifier {
129127 required bool isEmulator,
130128 String ? audience,
131129 }) {
130+ Never throws (String message) {
131+ throw FirebaseAuthAdminException (
132+ AuthClientErrorCode .invalidArgument,
133+ message,
134+ );
135+ }
136+
132137 final header = fullDecodedToken.header ?? < String , dynamic > {};
133138 final payload = fullDecodedToken.payload as Map ;
134139
@@ -141,7 +146,6 @@ class FirebaseTokenVerifier {
141146 late final alg = header['alg' ];
142147 late final sub = payload['sub' ];
143148
144- String ? errorMessage;
145149 if (! isEmulator && ! header.containsKey ('kid' )) {
146150 final isCustomToken = (payload['aud' ] == _firebaseAudience);
147151
@@ -151,53 +155,55 @@ class FirebaseTokenVerifier {
151155 d is Map &&
152156 d.containsKey ('uid' );
153157
158+ String message;
154159 if (isCustomToken) {
155- errorMessage = '${tokenInfo .verifyApiName } expects $_shortNameArticle '
160+ message = '${tokenInfo .verifyApiName } expects $_shortNameArticle '
156161 '${tokenInfo .shortName }, but was given a custom token.' ;
157162 } else if (isLegacyCustomToken) {
158- errorMessage = '${tokenInfo .verifyApiName } expects $_shortNameArticle '
163+ message = '${tokenInfo .verifyApiName } expects $_shortNameArticle '
159164 '${tokenInfo .shortName }, but was given a legacy custom token.' ;
160165 } else {
161- errorMessage = '${tokenInfo .jwtName } has no "kid" claim.' ;
166+ message = '${tokenInfo .jwtName } has no "kid" claim.' ;
162167 }
163168
164- errorMessage += verifyJwtTokenDocsMessage ;
169+ throws (message) ;
165170 } else if (! isEmulator && alg != _algorithmRS256) {
166- errorMessage = '${tokenInfo .jwtName } has incorrect algorithm. '
171+ throws ( '${tokenInfo .jwtName } has incorrect algorithm. '
167172 'Expected "$_algorithmRS256 " but got "$alg ".'
168- '$verifyJwtTokenDocsMessage ' ;
173+ '$verifyJwtTokenDocsMessage ' ) ;
169174 } else if (audience != null &&
170175 ! (payload['aud' ] as String ).contains (audience)) {
171- errorMessage =
172- '${tokenInfo .jwtName } has incorrect "aud" (audience) claim. '
173- 'Expected "$audience " but got "${payload ['aud' ]}".'
174- '$verifyJwtTokenDocsMessage ' ;
176+ throws (
177+ '${tokenInfo .jwtName } has incorrect "aud" (audience) claim. '
178+ 'Expected "$audience " but got "${payload ['aud' ]}".'
179+ '$verifyJwtTokenDocsMessage ' ,
180+ );
175181 } else if (audience == null && payload['aud' ] != projectId) {
176- errorMessage =
177- '${tokenInfo .jwtName } has incorrect "aud" (audience) claim. '
178- 'Expected "$projectId " but got "${payload ['aud' ]}".'
179- '$projectIdMatchMessage $verifyJwtTokenDocsMessage ' ;
182+ throws (
183+ '${tokenInfo .jwtName } has incorrect "aud" (audience) claim. '
184+ 'Expected "$projectId " but got "${payload ['aud' ]}".'
185+ '$projectIdMatchMessage $verifyJwtTokenDocsMessage ' ,
186+ );
180187 } else if (payload['iss' ] != '$issuer $projectId ' ) {
181- errorMessage = '${tokenInfo .jwtName } has incorrect "iss" (issuer) claim. '
182- 'Expected "$issuer $projectId " but got "${payload ['iss' ]}".'
183- '$projectIdMatchMessage $verifyJwtTokenDocsMessage ' ;
188+ throws (
189+ '${tokenInfo .jwtName } has incorrect "iss" (issuer) claim. '
190+ 'Expected "$issuer $projectId " but got "${payload ['iss' ]}".'
191+ '$projectIdMatchMessage $verifyJwtTokenDocsMessage ' ,
192+ );
184193 } else if (sub is ! String ) {
185- errorMessage = '${tokenInfo .jwtName } has no "sub" (subject) claim.'
186- '$verifyJwtTokenDocsMessage ' ;
194+ throws (
195+ '${tokenInfo .jwtName } has no "sub" (subject) claim.'
196+ '$verifyJwtTokenDocsMessage ' ,
197+ );
187198 } else if (sub.isEmpty) {
188- errorMessage =
189- '${tokenInfo .jwtName } has an empty string "sub" (subject) claim.'
190- '$verifyJwtTokenDocsMessage ' ;
199+ throws (
200+ '${tokenInfo .jwtName } has an empty string "sub" (subject) claim.'
201+ '$verifyJwtTokenDocsMessage ' ,
202+ );
191203 } else if (sub.length > 128 ) {
192- errorMessage =
193- '${tokenInfo .jwtName } has "sub" (subject) claim longer than 128 characters.'
194- '$verifyJwtTokenDocsMessage ' ;
195- }
196-
197- if (errorMessage != null ) {
198- throw FirebaseAuthAdminException (
199- AuthClientErrorCode .invalidArgument,
200- errorMessage,
204+ throws (
205+ '${tokenInfo .jwtName } has "sub" (subject) claim longer than 128 characters.'
206+ '$verifyJwtTokenDocsMessage ' ,
201207 );
202208 }
203209 }
@@ -249,6 +255,14 @@ class TokenProvider {
249255 required this .tenant,
250256 });
251257
258+ @internal
259+ TokenProvider .fromMap (Map <Object ?, Object ?> map)
260+ : identities = Map .from (map['identities' ]! as Map ),
261+ signInProvider = map['sign_in_provider' ]! as String ,
262+ signInSecondFactor = map['sign_in_second_factor' ] as String ? ,
263+ secondFactorIdentifier = map['second_factor_identifier' ] as String ? ,
264+ tenant = map['tenant' ] as String ? ;
265+
252266 /// Provider-specific identity details corresponding
253267 /// to the provider used to sign in the user.
254268 Map <String , Object ?> identities;
@@ -313,19 +327,13 @@ class DecodedIdToken {
313327 email: map['email' ] as String ? ,
314328 emailVerified: map['email_verified' ] as bool ? ,
315329 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- ),
330+ firebase: TokenProvider .fromMap (map['firebase' ]! as Map ),
323331 iat: map['iat' ]! as int ,
324332 iss: map['iss' ]! as String ,
325333 phoneNumber: map['phone_number' ] as String ? ,
326334 picture: map['picture' ] as String ? ,
327335 sub: map['sub' ]! as String ,
328- uid: map['uid ' ]! as String ,
336+ uid: map['sub ' ]! as String ,
329337 );
330338 }
331339
0 commit comments