Skip to content

Commit 0633ff2

Browse files
committed
Use the authentication response cookie fields to search for flow cookies
1 parent 35d7c72 commit 0633ff2

4 files changed

Lines changed: 59 additions & 12 deletions

File tree

descopesdk/src/main/java/com/descope/android/DescopeFlowCoordinator.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -454,9 +454,10 @@ document.head.appendChild(element)
454454
try {
455455
val jwtServerResponse = JwtServerResponse.fromJson(data, emptyList())
456456
// take tokens from cookies if missing
457-
val cookieString = CookieManager.getInstance().getCookie(url)
458-
jwtServerResponse.sessionJwt = jwtServerResponse.sessionJwt ?: findJwtInCookies(cookieString, name = SESSION_COOKIE_NAME)
459-
jwtServerResponse.refreshJwt = jwtServerResponse.refreshJwt ?: findJwtInCookies(cookieString, name = REFRESH_COOKIE_NAME)
457+
val respCookieString = CookieManager.getInstance().getCookie("https://${jwtServerResponse.cookieDomain}${jwtServerResponse.cookiePath}")
458+
val urlCookieString = CookieManager.getInstance().getCookie(url)
459+
jwtServerResponse.sessionJwt = jwtServerResponse.sessionJwt ?: findJwtInCookies(SESSION_COOKIE_NAME, respCookieString, urlCookieString)
460+
jwtServerResponse.refreshJwt = jwtServerResponse.refreshJwt ?: findJwtInCookies(REFRESH_COOKIE_NAME, respCookieString, urlCookieString)
460461
val authResponse = jwtServerResponse.convert()
461462
logger.debug("Flow received an authentication response", data)
462463
handleSuccess(authResponse)
@@ -654,12 +655,13 @@ private fun String.escapeForBackticks() = replace("\\", "\\\\")
654655

655656
// Cookies
656657

657-
internal fun findJwtInCookies(cookieString: String?, name: String): String? {
658-
// split and aggregate all cookies
659-
val cookies = mutableListOf<HttpCookie>().apply {
658+
internal fun findJwtInCookies(name: String, vararg cookieStrings: String?): String? {
659+
val cookies = mutableListOf<HttpCookie>()
660+
cookieStrings.forEach { cookieString ->
661+
// split and aggregate all cookies
660662
cookieString?.split("; ")?.forEach {
661663
try {
662-
addAll(HttpCookie.parse(it))
664+
cookies.addAll(HttpCookie.parse(it))
663665
} catch (_: Exception) {
664666
}
665667
}

descopesdk/src/main/java/com/descope/internal/http/Responses.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ internal data class JwtServerResponse(
1717
var refreshJwt: String?,
1818
val user: UserResponse?,
1919
val firstSeen: Boolean,
20+
val cookieDomain: String,
21+
val cookiePath: String,
2022
) {
2123
companion object {
2224
fun fromJson(json: String, cookies: List<HttpCookie>) = JSONObject(json).run {
@@ -36,6 +38,8 @@ internal data class JwtServerResponse(
3638
refreshJwt = stringOrEmptyAsNull("refreshJwt") ?: refreshJwt,
3739
user = optJSONObject("user")?.run { UserResponse.fromJson(this) },
3840
firstSeen = optBoolean("firstSeen"),
41+
cookieDomain = stringOrEmptyAsNull("cookieDomain") ?: "",
42+
cookiePath = stringOrEmptyAsNull("cookiePath") ?: "",
3943
)
4044
}
4145
}

descopesdk/src/test/java/com/descope/internal/routes/TestUtils.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,9 @@ internal val mockJwtResponse = JwtServerResponse(
106106
totp = true,
107107
saml = true,
108108
scim = true,
109-
)
109+
),
110+
cookieDomain = "domain",
111+
cookiePath = "/path",
110112
)
111113

112114
private object MockInfo: SystemInfo {

descopesdk/src/test/java/com/descope/session/TokenTest.kt

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class TokenTest {
4545
cookies.add(HttpCookie("name$i", "value$i"))
4646
}
4747
cookies.add(HttpCookie(REFRESH_COOKIE_NAME, jwtForP123))
48-
val refreshJwt = findJwtInCookies(cookies.joinToString(separator = "; "), name = REFRESH_COOKIE_NAME)
48+
val refreshJwt = findJwtInCookies(name = REFRESH_COOKIE_NAME, cookies.joinToString(separator = "; "))
4949
assertEquals(jwtForP123, refreshJwt)
5050
}
5151

@@ -58,7 +58,7 @@ class TokenTest {
5858
}
5959
cookies.add(HttpCookie(REFRESH_COOKIE_NAME, jwtForP123))
6060

61-
val refreshJwt = findJwtInCookies(cookies.joinToString(separator = "; "), name = REFRESH_COOKIE_NAME)
61+
val refreshJwt = findJwtInCookies(name = REFRESH_COOKIE_NAME, cookies.joinToString(separator = "; "))
6262
assertEquals(jwtForP456, refreshJwt)
6363
}
6464

@@ -71,7 +71,7 @@ class TokenTest {
7171
}
7272
cookies.add(HttpCookie(SESSION_COOKIE_NAME, jwtForP123))
7373

74-
var refreshJwt = findJwtInCookies(cookies.joinToString(separator = "; "), name = SESSION_COOKIE_NAME)
74+
var refreshJwt = findJwtInCookies(name = SESSION_COOKIE_NAME, cookies.joinToString(separator = "; "))
7575
assertEquals(laterJwtForP123, refreshJwt)
7676

7777
// try again with a different order
@@ -82,8 +82,47 @@ class TokenTest {
8282
}
8383
cookies.add(HttpCookie(SESSION_COOKIE_NAME, laterJwtForP123))
8484

85-
refreshJwt = findJwtInCookies(cookies.joinToString(separator = "; "), name = SESSION_COOKIE_NAME)
85+
refreshJwt = findJwtInCookies(name = SESSION_COOKIE_NAME, cookies.joinToString(separator = "; "))
8686
assertEquals(laterJwtForP123, refreshJwt)
8787
}
8888

89+
@Test
90+
fun cookies_oneDsr_multipleStrings() {
91+
val cookies = mutableListOf<HttpCookie>()
92+
for (i in 0 until 10) {
93+
cookies.add(HttpCookie("name$i", "value$i"))
94+
}
95+
cookies.add(HttpCookie(REFRESH_COOKIE_NAME, jwtForP123))
96+
val moreCookies = mutableListOf<HttpCookie>()
97+
for (i in 10 until 20) {
98+
moreCookies.add(HttpCookie("name$i", "value$i"))
99+
}
100+
val refreshJwt = findJwtInCookies(name = REFRESH_COOKIE_NAME, moreCookies.joinToString(separator = "; "), cookies.joinToString(separator = "; "))
101+
assertEquals(jwtForP123, refreshJwt)
102+
}
103+
104+
@Test
105+
fun cookies_multipleDs_multipleStrings() {
106+
val cookies = mutableListOf<HttpCookie>()
107+
cookies.add(HttpCookie(SESSION_COOKIE_NAME, laterJwtForP123))
108+
for (i in 0 until 10) {
109+
cookies.add(HttpCookie("name$i", "value$i"))
110+
}
111+
112+
val moreCookies = mutableListOf<HttpCookie>()
113+
moreCookies.add(HttpCookie(SESSION_COOKIE_NAME, laterJwtForP123))
114+
for (i in 0 until 10) {
115+
moreCookies.add(HttpCookie("name$i", "value$i"))
116+
}
117+
moreCookies.add(HttpCookie(SESSION_COOKIE_NAME, jwtForP123))
118+
119+
120+
121+
var refreshJwt = findJwtInCookies(name = SESSION_COOKIE_NAME, cookies.joinToString(separator = "; "), moreCookies.joinToString(separator = "; "))
122+
assertEquals(laterJwtForP123, refreshJwt)
123+
124+
// try again with a different order
125+
refreshJwt = findJwtInCookies(name = SESSION_COOKIE_NAME, moreCookies.joinToString(separator = "; "), cookies.joinToString(separator = "; "))
126+
assertEquals(laterJwtForP123, refreshJwt)
127+
}
89128
}

0 commit comments

Comments
 (0)