From 9a1e531dfe2fb5f481d5cd5c9d18ab24805be568 Mon Sep 17 00:00:00 2001 From: Takeshi Tsukamoto Date: Thu, 2 Nov 2023 06:00:43 +0900 Subject: [PATCH] Fix email verified type (#309) Co-authored-by: Rita Zerrizuela --- .../extensions/user_profile_extension.dart | 7 ++- .../user_profile_extension_test.dart | 58 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/auth0_flutter/lib/src/web/extensions/user_profile_extension.dart b/auth0_flutter/lib/src/web/extensions/user_profile_extension.dart index 95201c01..2a15fdc8 100644 --- a/auth0_flutter/lib/src/web/extensions/user_profile_extension.dart +++ b/auth0_flutter/lib/src/web/extensions/user_profile_extension.dart @@ -28,6 +28,11 @@ extension UserProfileExtension on UserProfile { final updatedAt = claims[PublicClaims.updatedAt] != null ? DateTime.parse(claims[PublicClaims.updatedAt] as String) : null; + final isEmailVerified = claims[PublicClaims.emailVerified] != null + ? claims[PublicClaims.emailVerified] is bool + ? claims[PublicClaims.emailVerified] as bool + : claims[PublicClaims.emailVerified] == 'true' + : null; return UserProfile( sub: claims[PublicClaims.sub] as String, @@ -41,7 +46,7 @@ extension UserProfileExtension on UserProfile { pictureUrl: pictureUrl, websiteUrl: websiteUrl, email: claims[PublicClaims.email] as String?, - isEmailVerified: claims[PublicClaims.emailVerified] as bool?, + isEmailVerified: isEmailVerified, gender: claims[PublicClaims.gender] as String?, birthdate: claims[PublicClaims.birthdate] as String?, zoneinfo: claims[PublicClaims.zoneinfo] as String?, diff --git a/auth0_flutter/test/web/extensions/user_profile_extension_test.dart b/auth0_flutter/test/web/extensions/user_profile_extension_test.dart index 89f15aee..00868497 100644 --- a/auth0_flutter/test/web/extensions/user_profile_extension_test.dart +++ b/auth0_flutter/test/web/extensions/user_profile_extension_test.dart @@ -128,6 +128,64 @@ void main() { expect(result.customClaims, customClaims); }); + test('creates UserProfile from claims with stringified email_verified', + () async { + const Map claims = { + ...requiredValues, + PublicClaims.name: 'John Alexander Doe', + PublicClaims.givenName: 'John', + PublicClaims.familyName: 'Doe', + PublicClaims.middleName: 'Alexander', + PublicClaims.nickname: 'johnny', + PublicClaims.preferredUsername: 'johnnyD', + PublicClaims.profile: 'https://example.com/profile', + PublicClaims.picture: 'https://example.com/picture.png', + PublicClaims.website: 'https://example.com', + PublicClaims.email: 'john.doe@example.com', + PublicClaims.emailVerified: 'true', + PublicClaims.gender: 'male', + PublicClaims.birthdate: '01-01-2000', + PublicClaims.zoneinfo: 'America/Chicago', + PublicClaims.locale: 'en-US', + PublicClaims.phoneNumber: '111111111', + PublicClaims.phoneNumberVerified: true, + PublicClaims.address: {'street': '1 Foo St', 'zip_code': '11111-1111'}, + PublicClaims.updatedAt: '2023-02-28T15:08:56+00:00', + 'foo': 'bar' + }; + + final result = UserProfileExtension.fromClaims(claims); + + expect(result.name, claims[PublicClaims.name]); + expect(result.givenName, claims[PublicClaims.givenName]); + expect(result.familyName, claims[PublicClaims.familyName]); + expect(result.middleName, claims[PublicClaims.middleName]); + expect(result.nickname, claims[PublicClaims.nickname]); + expect(result.preferredUsername, claims[PublicClaims.preferredUsername]); + expect( + result.profileUrl, Uri.parse(claims[PublicClaims.profile] as String)); + expect( + result.pictureUrl, Uri.parse(claims[PublicClaims.picture] as String)); + expect( + result.websiteUrl, Uri.parse(claims[PublicClaims.website] as String)); + expect(result.email, claims[PublicClaims.email]); + expect( + result.isEmailVerified, + claims[PublicClaims.emailVerified] == 'true', + ); + expect(result.gender, claims[PublicClaims.gender]); + expect(result.birthdate, claims[PublicClaims.birthdate]); + expect(result.zoneinfo, claims[PublicClaims.zoneinfo]); + expect(result.locale, claims[PublicClaims.locale]); + expect(result.phoneNumber, claims[PublicClaims.phoneNumber]); + expect(result.isPhoneNumberVerified, + claims[PublicClaims.phoneNumberVerified]); + expect(result.address, claims[PublicClaims.address]); + expect(result.updatedAt, + DateTime.parse(claims[PublicClaims.updatedAt] as String)); + expect(result.customClaims?['foo'], claims['foo']); + }); + test('throws exception with invalid profile URL', () async { const Map claims = { ...requiredValues,