Skip to content

Commit 40aa9c5

Browse files
committed
feat: expose externalToken on AuthenticationResponse
1 parent f15bef1 commit 40aa9c5

4 files changed

Lines changed: 38 additions & 1 deletion

File tree

src/internal/http/DescopeClient.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,7 @@ final class DescopeClient: HTTPClient, @unchecked Sendable {
447447
var cookieDomain: String?
448448
var cookieName: String?
449449
var sessionCookieName: String?
450+
var externalToken: String?
450451

451452
mutating func setValues(from data: Data, response: HTTPURLResponse) throws {
452453
guard let url = response.url, let fields = response.allHeaderFields as? [String: String] else { return }

src/internal/routes/Shared.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ extension DescopeClient.JWTResponse {
7373
guard let sessionJwt, !sessionJwt.isEmpty else { throw DescopeError.decodeError.with(message: "Missing session JWT") }
7474
guard let refreshJwt, !refreshJwt.isEmpty else { throw DescopeError.decodeError.with(message: "Missing refresh JWT") }
7575
guard let user else { throw DescopeError.decodeError.with(message: "Missing user details") }
76-
return try AuthenticationResponse(sessionToken: Token(jwt: sessionJwt), refreshToken: Token(jwt: refreshJwt), user: user.convert(), isFirstAuthentication: firstSeen)
76+
return try AuthenticationResponse(sessionToken: Token(jwt: sessionJwt), refreshToken: Token(jwt: refreshJwt), user: user.convert(), isFirstAuthentication: firstSeen, externalToken: externalToken)
7777
}
7878
}
7979

src/types/Responses.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public struct AuthenticationResponse: Sendable {
1010
public var refreshToken: DescopeToken
1111
public var user: DescopeUser
1212
public var isFirstAuthentication: Bool
13+
public var externalToken: String?
1314
}
1415

1516
/// Returned from the ``DescopeAuth/refreshSession(refreshJwt:)`` call.

test/http/JWTResponse.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,22 @@ class TestJWTResponse: XCTestCase {
3232
XCTAssertEqual("qux", authResponse.refreshToken.entityId)
3333
}
3434

35+
func testExternalToken() async throws {
36+
// with external token
37+
var data = Data(externalTokenPayload.utf8)
38+
var jwtResponse = try JSONDecoder().decode(DescopeClient.JWTResponse.self, from: data)
39+
try jwtResponse.setValues(from: data, cookies: [], refreshCookieName: nil)
40+
var authResponse: AuthenticationResponse = try jwtResponse.convert()
41+
XCTAssertEqual("ext-token-value", authResponse.externalToken)
42+
43+
// no external token
44+
data = Data(noExternalTokenPayload.utf8)
45+
jwtResponse = try JSONDecoder().decode(DescopeClient.JWTResponse.self, from: data)
46+
try jwtResponse.setValues(from: data, cookies: [], refreshCookieName: nil)
47+
authResponse = try jwtResponse.convert()
48+
XCTAssertNil(authResponse.externalToken)
49+
}
50+
3551
func testPageCookie() async throws {
3652
let data = Data(authPayload.utf8)
3753

@@ -92,6 +108,25 @@ private let authPayload = """
92108
}
93109
"""
94110

111+
private let externalTokenPayload = """
112+
{
113+
"sessionJwt": "\(sessionJwt)",
114+
"refreshJwt": "\(refreshJwt)",
115+
"user": \(userPayload),
116+
"firstSeen": true,
117+
"externalToken": "ext-token-value"
118+
}
119+
"""
120+
121+
private let noExternalTokenPayload = """
122+
{
123+
"sessionJwt": "\(sessionJwt)",
124+
"refreshJwt": "\(refreshJwt)",
125+
"user": \(userPayload),
126+
"firstSeen": true
127+
}
128+
"""
129+
95130
private let userPayload = """
96131
{
97132
"userId": "userId",

0 commit comments

Comments
 (0)