Skip to content

added AuthTokenResult #142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Feb 3, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Any>
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) } }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ 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 getIdTokenResult(forceRefresh: Boolean) = 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())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,15 @@ expect class AuthResult {
val user: FirebaseUser?
}

expect class AuthTokenResult {
// val authTimestamp: Long
val claims: Map<String, Any>
// val expirationTimestamp: Long
// val issuedAtTimestamp: Long
val signInProvider: String?
val token: String?
Comment on lines +49 to +50
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can they be null?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately the properties in Android SDK are marked as @Nullable, so didn't want to risk a crash.

}

sealed class ActionCodeResult {
object SignInWithEmailLink : ActionCodeResult()
class PasswordReset internal constructor(val email: String) : ActionCodeResult()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ expect class FirebaseUser {
val providerId: String
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
Expand Down
15 changes: 15 additions & 0 deletions firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Any>
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) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ actual class FirebaseUser internal constructor(val ios: FIRUser) {

actual suspend fun reload() = ios.await { reloadWithCompletion(it) }.run { Unit }

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) })
Expand Down
15 changes: 15 additions & 0 deletions firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/auth.kt
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,21 @@ 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<String, Any>
get() = js.claims
// 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),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ actual class FirebaseUser internal constructor(val js: firebase.user.User) {
get() = rethrow { js.providerId }
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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: Map<String, Any>
val expirationTime: String
val issuedAtTime: String
val signInProvider: String?
val signInSecondFactor: String?
val token: String
}

abstract class AuthResult {
val credential: AuthCredential?
val operationType: String?
Expand Down Expand Up @@ -187,6 +198,7 @@ external object firebase {

fun delete(): Promise<Unit>
fun getIdToken(forceRefresh: Boolean?): Promise<String>
fun getIdTokenResult(forceRefresh: Boolean?): Promise<auth.IdTokenResult>
fun linkWithCredential(credential: auth.AuthCredential): Promise<auth.AuthResult>
fun reauthenticateWithCredential(credential: auth.AuthCredential): Promise<auth.AuthResult>
fun reload(): Promise<Unit>
Expand Down