diff --git a/firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/auth.kt b/firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/auth.kt index e2100b555..d23af170b 100644 --- a/firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/auth.kt +++ b/firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/auth.kt @@ -111,6 +111,21 @@ actual class AuthResult internal constructor(val android: com.google.firebase.au get() = android.user?.let { FirebaseUser(it) } } +actual class AuthTokenResult(val android: com.google.firebase.auth.GetTokenResult) { +// actual val authTimestamp: Long +// get() = android.authTimestamp + actual val claims: Map + get() = android.claims +// actual val expirationTimestamp: Long +// get() = android.expirationTimestamp +// actual val issuedAtTimestamp: Long +// get() = android.issuedAtTimestamp + actual val signInProvider: String? + get() = android.signInProvider + actual val token: String? + get() = android.token +} + internal fun ActionCodeSettings.toAndroid() = com.google.firebase.auth.ActionCodeSettings.newBuilder() .setUrl(url) .also { androidPackageName?.run { it.setAndroidPackageName(packageName, installIfNotAvailable, minimumVersion) } } diff --git a/firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/user.kt b/firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/user.kt index 0b15272b0..47a942bdb 100644 --- a/firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/user.kt +++ b/firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/user.kt @@ -33,7 +33,8 @@ actual class FirebaseUser internal constructor(val android: com.google.firebase. get() = android.providerId actual suspend fun delete() = android.delete().await().run { Unit } actual suspend fun reload() = android.reload().await().run { Unit } - actual suspend fun getIdToken(forceRefresh: Boolean) = android.getIdToken(forceRefresh).await().token + actual suspend fun getIdToken(forceRefresh: Boolean): String? = android.getIdToken(forceRefresh).await().token + actual suspend fun getIdTokenResult(forceRefresh: Boolean): AuthTokenResult = android.getIdToken(forceRefresh).await().run { AuthTokenResult(this) } actual suspend fun linkWithCredential(credential: AuthCredential): AuthResult = AuthResult(android.linkWithCredential(credential.android).await()) actual suspend fun reauthenticate(credential: AuthCredential) = android.reauthenticate(credential.android).await().run { Unit } actual suspend fun reauthenticateAndRetrieveData(credential: AuthCredential): AuthResult = AuthResult(android.reauthenticateAndRetrieveData(credential.android).await()) diff --git a/firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/auth.kt b/firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/auth.kt index 149fdef09..ea9981b40 100644 --- a/firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/auth.kt +++ b/firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/auth.kt @@ -41,6 +41,15 @@ expect class AuthResult { val user: FirebaseUser? } +expect class AuthTokenResult { +// val authTimestamp: Long + val claims: Map +// val expirationTimestamp: Long +// val issuedAtTimestamp: Long + val signInProvider: String? + val token: String? +} + sealed class ActionCodeResult { object SignInWithEmailLink : ActionCodeResult() class PasswordReset internal constructor(val email: String) : ActionCodeResult() diff --git a/firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/user.kt b/firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/user.kt index 6a31b2573..3d00c412f 100644 --- a/firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/user.kt +++ b/firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/user.kt @@ -19,6 +19,7 @@ expect class FirebaseUser { suspend fun delete() suspend fun reload() suspend fun getIdToken(forceRefresh: Boolean): String? + suspend fun getIdTokenResult(forceRefresh: Boolean): AuthTokenResult suspend fun linkWithCredential(credential: AuthCredential): AuthResult suspend fun reauthenticate(credential: AuthCredential) suspend fun reauthenticateAndRetrieveData(credential: AuthCredential): AuthResult diff --git a/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt b/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt index e2dba0679..9c83e881e 100644 --- a/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt +++ b/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt @@ -98,6 +98,21 @@ actual class AuthResult internal constructor(val ios: FIRAuthDataResult) { get() = FirebaseUser(ios.user) } +actual class AuthTokenResult(val ios: FIRAuthTokenResult) { +// actual val authTimestamp: Long +// get() = ios.authDate + actual val claims: Map + get() = ios.claims.map { it.key.toString() to it.value as Any }.toMap() +// actual val expirationTimestamp: Long +// get() = ios.expirationDate +// actual val issuedAtTimestamp: Long +// get() = ios.issuedAtDate + actual val signInProvider: String? + get() = ios.signInProvider + actual val token: String? + get() = ios.token +} + internal fun ActionCodeSettings.toIos() = FIRActionCodeSettings().also { it.URL = NSURL.URLWithString(url) androidPackageName?.run { it.setAndroidPackageName(packageName, installIfNotAvailable, minimumVersion) } diff --git a/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/user.kt b/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/user.kt index 1b10a5b0d..d322fdb4c 100644 --- a/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/user.kt +++ b/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/user.kt @@ -38,6 +38,9 @@ actual class FirebaseUser internal constructor(val ios: FIRUser) { actual suspend fun getIdToken(forceRefresh: Boolean): String? = ios.awaitResult { getIDTokenForcingRefresh(forceRefresh, it) } + actual suspend fun getIdTokenResult(forceRefresh: Boolean): AuthTokenResult = + AuthTokenResult(ios.awaitResult { getIDTokenResultForcingRefresh(forceRefresh, it) }) + actual suspend fun linkWithCredential(credential: AuthCredential): AuthResult = AuthResult(ios.awaitResult { linkWithCredential(credential.ios, it) }) diff --git a/firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/auth.kt b/firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/auth.kt index f62c0b728..8f270e351 100644 --- a/firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/auth.kt +++ b/firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/auth.kt @@ -101,6 +101,23 @@ actual class AuthResult internal constructor(val js: firebase.auth.AuthResult) { get() = rethrow { js.user?.let { FirebaseUser(it) } } } +actual class AuthTokenResult(val js: firebase.auth.IdTokenResult) { +// actual val authTimestamp: Long +// get() = js.authTime + actual val claims: Map + get() = (js("Object").keys(js.claims) as Array).mapNotNull { + key -> js.claims[key]?.let { key to it } + }.toMap() +// actual val expirationTimestamp: Long +// get() = android.expirationTime +// actual val issuedAtTimestamp: Long +// get() = js.issuedAtTime + actual val signInProvider: String? + get() = js.signInProvider + actual val token: String? + get() = js.token +} + internal fun ActionCodeSettings.toJson() = json( "android" to (androidPackageName?.run { json("installApp" to installIfNotAvailable, "minimumVersion" to minimumVersion, "packageName" to packageName) } ?: undefined), "dynamicLinkDomain" to (dynamicLinkDomain ?: undefined), diff --git a/firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/user.kt b/firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/user.kt index 0a0463231..ab6cb796e 100644 --- a/firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/user.kt +++ b/firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/user.kt @@ -30,6 +30,7 @@ actual class FirebaseUser internal constructor(val js: firebase.user.User) { actual suspend fun delete() = rethrow { js.delete().await() } actual suspend fun reload() = rethrow { js.reload().await() } actual suspend fun getIdToken(forceRefresh: Boolean): String? = rethrow { js.getIdToken(forceRefresh).await() } + actual suspend fun getIdTokenResult(forceRefresh: Boolean): AuthTokenResult = rethrow { AuthTokenResult(js.getIdTokenResult(forceRefresh).await()) } actual suspend fun linkWithCredential(credential: AuthCredential): AuthResult = rethrow { AuthResult(js.linkWithCredential(credential.js).await()) } actual suspend fun reauthenticate(credential: AuthCredential) = rethrow { js.reauthenticateWithCredential(credential.js).await() diff --git a/firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt b/firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt index 1bd6b064f..c76cb037e 100644 --- a/firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt +++ b/firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt @@ -68,6 +68,17 @@ external object firebase { fun onAuthStateChanged(nextOrObserver: (user.User?) -> Unit): () -> Unit fun onIdTokenChanged(nextOrObserver: (user.User?) -> Unit): () -> Unit } + + abstract class IdTokenResult { + val authTime: String + val claims: Json + val expirationTime: String + val issuedAtTime: String + val signInProvider: String? + val signInSecondFactor: String? + val token: String + } + abstract class AuthResult { val credential: AuthCredential? val operationType: String? @@ -187,6 +198,7 @@ external object firebase { fun delete(): Promise fun getIdToken(forceRefresh: Boolean?): Promise + fun getIdTokenResult(forceRefresh: Boolean?): Promise fun linkWithCredential(credential: auth.AuthCredential): Promise fun reauthenticateWithCredential(credential: auth.AuthCredential): Promise fun reload(): Promise