Skip to content

Commit eb214ad

Browse files
committed
DataConnectAuth.kt: just get the authUid from the sub claim, not the sub AND user_id claims
1 parent c2e6da1 commit eb214ad

File tree

3 files changed

+13
-55
lines changed

3 files changed

+13
-55
lines changed

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectAuth.kt

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,10 @@ internal class DataConnectAuth(
5050

5151
override suspend fun getToken(provider: InternalAuthProvider, forceRefresh: Boolean) =
5252
provider.getAccessToken(forceRefresh).await().let {
53-
GetAuthTokenResult(it.token, it.getAuthUids())
53+
GetAuthTokenResult(it.token, it.getAuthUid())
5454
}
5555

56-
data class GetAuthTokenResult(override val token: String?, val authUids: Set<String>) :
57-
GetTokenResult
56+
data class GetAuthTokenResult(override val token: String?, val authUid: String?) : GetTokenResult
5857

5958
private class IdTokenListenerImpl(private val logger: Logger) : IdTokenListener {
6059
override fun onIdTokenChanged(tokenResult: InternalTokenResult) {
@@ -64,16 +63,6 @@ internal class DataConnectAuth(
6463

6564
private companion object {
6665

67-
val authUidClaimNames = listOf("user_id", "sub")
68-
69-
fun com.google.firebase.auth.GetTokenResult.getAuthUids(): Set<String> = buildSet {
70-
authUidClaimNames.forEach { claimName ->
71-
claims[claimName]?.let { claimValue ->
72-
if (claimValue is String) {
73-
add(claimValue)
74-
}
75-
}
76-
}
77-
}
66+
fun com.google.firebase.auth.GetTokenResult.getAuthUid(): String? = claims["sub"] as? String
7867
}
7968
}

firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectAuthUnitTest.kt

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import com.google.firebase.dataconnect.testutil.UnavailableDeferred
3232
import com.google.firebase.dataconnect.testutil.newBackgroundScopeThatAdvancesLikeForeground
3333
import com.google.firebase.dataconnect.testutil.newMockLogger
3434
import com.google.firebase.dataconnect.testutil.property.arbitrary.dataConnect
35-
import com.google.firebase.dataconnect.testutil.property.arbitrary.distinctPair
3635
import com.google.firebase.dataconnect.testutil.shouldContainWithNonAbuttingText
3736
import com.google.firebase.dataconnect.testutil.shouldContainWithNonAbuttingTextIgnoringCase
3837
import com.google.firebase.dataconnect.testutil.shouldHaveLoggedAtLeastOneMessageContaining
@@ -47,10 +46,8 @@ import io.kotest.assertions.nondeterministic.eventually
4746
import io.kotest.assertions.nondeterministic.eventuallyConfig
4847
import io.kotest.assertions.throwables.shouldThrow
4948
import io.kotest.assertions.withClue
50-
import io.kotest.matchers.collections.shouldBeEmpty
5149
import io.kotest.matchers.collections.shouldContain
5250
import io.kotest.matchers.collections.shouldContainExactly
53-
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
5451
import io.kotest.matchers.nulls.shouldBeNull
5552
import io.kotest.matchers.nulls.shouldNotBeNull
5653
import io.kotest.matchers.shouldBe
@@ -317,21 +314,7 @@ class DataConnectAuthUnitTest {
317314
}
318315

319316
@Test
320-
fun `getToken() should populate authUids from user_id claim`() = runTest {
321-
val dataConnectAuth = newDataConnectAuth()
322-
dataConnectAuth.initialize()
323-
advanceUntilIdle()
324-
val uid = Arb.brand().map { it.value }.next(rs)
325-
coEvery { mockInternalAuthProvider.getAccessToken(any()) } returns
326-
taskForToken(accessToken, mapOf("user_id" to uid))
327-
328-
val result = dataConnectAuth.getToken(requestId)
329-
330-
result.shouldNotBeNull().authUids.shouldContainExactly(uid)
331-
}
332-
333-
@Test
334-
fun `getToken() should populate authUids from sub claim`() = runTest {
317+
fun `getToken() should populate authUid from sub claim`() = runTest {
335318
val dataConnectAuth = newDataConnectAuth()
336319
dataConnectAuth.initialize()
337320
advanceUntilIdle()
@@ -341,25 +324,11 @@ class DataConnectAuthUnitTest {
341324

342325
val result = dataConnectAuth.getToken(requestId)
343326

344-
result.shouldNotBeNull().authUids.shouldContainExactly(uid)
345-
}
346-
347-
@Test
348-
fun `getToken() should populate authUids from user_id and sub claims`() = runTest {
349-
val dataConnectAuth = newDataConnectAuth()
350-
dataConnectAuth.initialize()
351-
advanceUntilIdle()
352-
val (uid1, uid2) = Arb.brand().map { it.value }.distinctPair().next(rs)
353-
coEvery { mockInternalAuthProvider.getAccessToken(any()) } returns
354-
taskForToken(accessToken, mapOf("user_id" to uid1, "sub" to uid2))
355-
356-
val result = dataConnectAuth.getToken(requestId)
357-
358-
result.shouldNotBeNull().authUids.shouldContainExactlyInAnyOrder(uid1, uid2)
327+
result.shouldNotBeNull().authUid shouldBe uid
359328
}
360329

361330
@Test
362-
fun `getToken() should populate empty authUids if claims are missing`() = runTest {
331+
fun `getToken() should populate null authUid if sub claim is missing`() = runTest {
363332
val dataConnectAuth = newDataConnectAuth()
364333
dataConnectAuth.initialize()
365334
advanceUntilIdle()
@@ -368,20 +337,20 @@ class DataConnectAuthUnitTest {
368337

369338
val result = dataConnectAuth.getToken(requestId)
370339

371-
result.shouldNotBeNull().authUids.shouldBeEmpty()
340+
result.shouldNotBeNull().authUid.shouldBeNull()
372341
}
373342

374343
@Test
375-
fun `getToken() should ignore non-string uid claims`() = runTest {
344+
fun `getToken() should populate null authUid if sub claim is not a String`() = runTest {
376345
val dataConnectAuth = newDataConnectAuth()
377346
dataConnectAuth.initialize()
378347
advanceUntilIdle()
379348
coEvery { mockInternalAuthProvider.getAccessToken(any()) } returns
380-
taskForToken(accessToken, mapOf("user_id" to 123, "sub" to true))
349+
taskForToken(accessToken, mapOf("sub" to 42))
381350

382351
val result = dataConnectAuth.getToken(requestId)
383352

384-
result.shouldNotBeNull().authUids shouldBe emptySet()
353+
result.shouldNotBeNull().authUid.shouldBeNull()
385354
}
386355

387356
@Test

firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/property/arbitrary/arbs.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ import io.kotest.property.arbitrary.int
5151
import io.kotest.property.arbitrary.list
5252
import io.kotest.property.arbitrary.map
5353
import io.kotest.property.arbitrary.orNull
54-
import io.kotest.property.arbitrary.set
5554
import io.kotest.property.arbitrary.string
5655
import io.mockk.coEvery
5756
import io.mockk.mockk
@@ -335,8 +334,9 @@ internal inline fun <Data, reified Variables> DataConnectArb.operationRefConstru
335334

336335
internal fun DataConnectArb.authTokenResult(
337336
accessToken: Arb<String?> = accessToken().orNull(nullProbability = 0.33),
338-
authUids: Arb<Set<String>> = Arb.set(string(0..10, Codepoint.alphanumeric()), 0..10),
339-
): Arb<GetAuthTokenResult> = Arb.bind(accessToken, authUids, ::GetAuthTokenResult)
337+
authUid: Arb<String?> =
338+
Arb.string(0..10, Codepoint.alphanumeric()).orNull(nullProbability = 0.33),
339+
): Arb<GetAuthTokenResult> = Arb.bind(accessToken, authUid, ::GetAuthTokenResult)
340340

341341
internal fun DataConnectArb.appCheckTokenResult(
342342
accessToken: Arb<String> = accessToken()

0 commit comments

Comments
 (0)