From b978362bd6e3ab02f16794fbd8c72ccd168a1789 Mon Sep 17 00:00:00 2001 From: Sandip Soni Date: Sun, 1 Mar 2020 15:40:56 +0530 Subject: [PATCH] Expose `MetaData` containing account creation and last sign-in timestamp. --- README.md | 13 ++++++++++-- .../firebase_auth_ui/FirebaseAuthUiPlugin.kt | 8 +++++++ ios/Classes/SwiftFirebaseAuthUiPlugin.swift | 18 ++++++++++++++++ .../firebase_auth_ui/firebase_auth_ui.dart | 6 ++++++ lib/src/firebase_auth_ui/firebase_user.dart | 21 ++++++++++++++++++- 5 files changed, 63 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a2bfedb..3903740 100644 --- a/README.md +++ b/README.md @@ -50,9 +50,18 @@ Field | Description | phoneNumber | Phone number of user | photoUri | URI of user's photo | providerId | Indicates through which provider user was authenticated. | - isNewUser | Indicates if user is new | + metaData | Object of MetaData | + +`MetaData` -Please note that above details may be null depending on the provider user used to sign and user's privacy settings on respective provider. +Field | Description | + --- | --- | + creationTimestamp | Timestamp of user's creation | + lastSignInTimestamp | Timestamp of user's last sign in | + +**Notes:** +- Above details may be null depending on the provider user used to sign and user's privacy settings on respective provider. +- creationTimestamp seems to return wrong value sometimes on Android. If you want to have full `FirebaseUser` object then please add [firebase_auth](https://pub.dev/packages/firebase_auth) dependency. You can then use `FirebaseAuth.instance.currentUser()`. diff --git a/android/src/main/kotlin/com/firebase_auth_ui/FirebaseAuthUiPlugin.kt b/android/src/main/kotlin/com/firebase_auth_ui/FirebaseAuthUiPlugin.kt index 9cb4e59..b640324 100644 --- a/android/src/main/kotlin/com/firebase_auth_ui/FirebaseAuthUiPlugin.kt +++ b/android/src/main/kotlin/com/firebase_auth_ui/FirebaseAuthUiPlugin.kt @@ -68,6 +68,14 @@ class FirebaseAuthUiPlugin(private val activity: Activity) : MethodCallHandler, userMap["is_anonymous"] = user.isAnonymous userMap["is_new_user"] = response?.isNewUser ?: false + // MetaData + val metadataMap = hashMapOf() + user.metadata?.let { metadata -> + metadataMap["creation_timestamp"] = metadata.creationTimestamp + metadataMap["last_sign_in_timestamp"] = metadata.lastSignInTimestamp + } + userMap["metadata"] = metadataMap + result?.success(userMap) } else { result?.error(ERROR_UNKNOWN, "Unknown error occurred.", null) diff --git a/ios/Classes/SwiftFirebaseAuthUiPlugin.swift b/ios/Classes/SwiftFirebaseAuthUiPlugin.swift index f297d70..b8d7f0e 100644 --- a/ios/Classes/SwiftFirebaseAuthUiPlugin.swift +++ b/ios/Classes/SwiftFirebaseAuthUiPlugin.swift @@ -89,6 +89,23 @@ public class SwiftFirebaseAuthUiPlugin: NSObject, FlutterPlugin, FUIAuthDelegate details: nil)) } } else { + var createdTimeStamp = Int(user?.metadata.creationDate?.timeIntervalSince1970 ?? -1) + var lastSignInTimeStamp = Int(user?.metadata.lastSignInDate?.timeIntervalSince1970 ?? -1) + + if createdTimeStamp != -1 { + // convert to milliseconds to match with Android + createdTimeStamp *= 1000 + } + + if lastSignInTimeStamp != -1 { + // convert to milliseconds to match with Android + lastSignInTimeStamp *= 1000 + } + + let metaDataDictionary: NSMutableDictionary = [ + "creation_timestamp": createdTimeStamp, + "last_sign_in_timestamp": lastSignInTimeStamp, + ] let userDisctionary : NSMutableDictionary = [ "display_name": user?.displayName ?? "", "email": user?.email ?? "", @@ -98,6 +115,7 @@ public class SwiftFirebaseAuthUiPlugin: NSObject, FlutterPlugin, FUIAuthDelegate "phone_number": user?.phoneNumber ?? "", "is_anonymous": user?.isAnonymous ?? false, "is_new_user": authDataResult?.additionalUserInfo?.isNewUser ?? false, + "metadata": metaDataDictionary, ] result?(userDisctionary) } diff --git a/lib/src/firebase_auth_ui/firebase_auth_ui.dart b/lib/src/firebase_auth_ui/firebase_auth_ui.dart index 8253335..87e45ad 100644 --- a/lib/src/firebase_auth_ui/firebase_auth_ui.dart +++ b/lib/src/firebase_auth_ui/firebase_auth_ui.dart @@ -49,6 +49,11 @@ class FirebaseAuthUi { } FirebaseUser _getFirebaseUser(Map userMap) { + MetaData metaData; + if (userMap?.containsKey("metadata") ?? false) { + metaData = MetaData(creationTimestamp: userMap["metadata"]["creation_timestamp"], + lastSignInTimestamp: userMap["metadata"]["last_sign_in_timestamp"]); + } return FirebaseUser( userMap["uid"] ?? "", userMap["display_name"] ?? "", @@ -56,6 +61,7 @@ class FirebaseAuthUi { userMap["phone_number"] ?? "", userMap["photo_url"] ?? "", userMap["provider_id"] ?? "", + metaData, isAnonymous: userMap["is_anonymous"] ?? false, isNewUser: userMap["is_new_user"]); } diff --git a/lib/src/firebase_auth_ui/firebase_user.dart b/lib/src/firebase_auth_ui/firebase_user.dart index 2ecde5e..4fdf2ec 100644 --- a/lib/src/firebase_auth_ui/firebase_user.dart +++ b/lib/src/firebase_auth_ui/firebase_user.dart @@ -7,9 +7,10 @@ class FirebaseUser { String providerId; bool isAnonymous; bool isNewUser; + MetaData metaData; FirebaseUser(this.uid, this.displayName, this.email, this.phoneNumber, - this.photoUri, this.providerId, + this.photoUri, this.providerId, this.metaData, {this.isAnonymous = false, this.isNewUser}); Map toJSON() { @@ -22,6 +23,24 @@ class FirebaseUser { "providerId": providerId, "isAnonymous": isAnonymous, "isNewUser": isNewUser, + "metaData": metaData.toJSON(), + }; + } +} + +class MetaData { + int creationTimestamp; + int lastSignInTimestamp; + + MetaData({ + this.creationTimestamp, + this.lastSignInTimestamp, + }); + + Map toJSON() { + return { + "creationTimestamp": creationTimestamp, + "lastSignInTimestamp": lastSignInTimestamp }; } }