Skip to content

Commit 24ca08c

Browse files
authored
refactor: update token response types (#130)
* refactor: update token response types * chore: add test case * refactor: fix test
1 parent b35f22d commit 24ca08c

File tree

5 files changed

+56
-9
lines changed

5 files changed

+56
-9
lines changed

Sources/Logto/Core/LogtoCore+Fetch.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public extension LogtoCore {
4646
struct CodeTokenResponse: Codable, Equatable {
4747
public let accessToken: String
4848
public let refreshToken: String?
49-
public let idToken: String
49+
public let idToken: String?
5050
public let scope: String
5151
public let expiresIn: Int64
5252
}
@@ -80,7 +80,7 @@ public extension LogtoCore {
8080

8181
struct RefreshTokenTokenResponse: Codable, Equatable {
8282
public let accessToken: String
83-
public let refreshToken: String
83+
public let refreshToken: String?
8484
public let idToken: String?
8585
public let scope: String
8686
public let expiresIn: Int64

Sources/LogtoClient/LogtoClient/LogtoClient+AccessToken.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ extension LogtoClient {
3434
)
3535

3636
accessTokenMap[key] = accessToken
37-
self.refreshToken = response.refreshToken
37+
38+
response.refreshToken.map {
39+
self.refreshToken = $0
40+
}
3841

3942
response.idToken.map {
4043
self.idToken = $0

Sources/LogtoClient/LogtoClient/LogtoClient+SignIn.swift

+8-6
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@ extension LogtoClient {
3030
let response = try await session.start()
3131
let jwks = try await fetchJwkSet()
3232

33-
try LogtoUtilities.verifyIdToken(
34-
response.idToken,
35-
issuer: oidcConfig.issuer,
36-
clientId: logtoConfig.appId,
37-
jwks: jwks
38-
)
33+
try response.idToken.map {
34+
try LogtoUtilities.verifyIdToken(
35+
$0,
36+
issuer: oidcConfig.issuer,
37+
clientId: logtoConfig.appId,
38+
jwks: jwks
39+
)
40+
}
3941

4042
idToken = response.idToken
4143
refreshToken = response.refreshToken

Tests/LogtoClientTests/LogtoClient/LogtoClientTests+AccessToken.swift

+21
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,27 @@ extension LogtoClientTests {
5151

5252
XCTAssertEqual(tokens[0], "123")
5353
XCTAssertEqual(tokens[1], "456")
54+
XCTAssertEqual(client.refreshToken, "789")
55+
XCTAssertEqual(client.idToken, "abc")
56+
}
57+
58+
func testGetAccessTokenByRefreshTokenWithoutRefreshAndIdTokenReturned() async throws {
59+
NetworkSessionMock.shared.tokenRequestCount = 0
60+
61+
let client = buildClient(withOidcEndpoint: "/oidc_config:good:no_refresh")
62+
client.idToken = "baz"
63+
client.refreshToken = "bar"
64+
client.accessTokenMap[client.buildAccessTokenKey(for: "resource1")] = AccessToken(
65+
token: "foo",
66+
scope: "",
67+
expiresAt: Date().timeIntervalSince1970 - 1
68+
)
69+
70+
let token = try await client.getAccessToken(for: "resource1")
71+
72+
XCTAssertEqual(token, "123")
73+
XCTAssertEqual(client.refreshToken, "bar")
74+
XCTAssertEqual(client.idToken, "baz")
5475
}
5576

5677
func testGetAccessTokenUnalbeToFetchOidcConfig() async throws {

Tests/LogtoMock/NetworkSessionMock.swift

+21
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ public class NetworkSessionMock: NetworkSession {
3333
"issuer": "http://localhost:443/oidc"
3434
}
3535
""".utf8), nil)
36+
case "oidc_config:good:no_refresh":
37+
return (Data("""
38+
{
39+
"authorization_endpoint": "https://logto.dev/auth:good",
40+
"token_endpoint": "https://logto.dev/token:good:no_refresh",
41+
"end_session_endpoint": "https://logto.dev/end:good",
42+
"revocation_endpoint": "https://logto.dev/revoke:good",
43+
"userinfo_endpoint": "https://logto.dev/user",
44+
"jwks_uri": "https://logto.dev/jwks:good",
45+
"issuer": "http://localhost:443/oidc"
46+
}
47+
""".utf8), nil)
3648
case "oidc_config:bad":
3749
return (Data("""
3850
{
@@ -86,6 +98,15 @@ public class NetworkSessionMock: NetworkSession {
8698
"expires_in": 123
8799
}
88100
""".utf8), nil)
101+
case "token:good:no_refresh":
102+
return (Data("""
103+
{
104+
"access_token": "123",
105+
"token_type": "jwt",
106+
"scope": "",
107+
"expires_in": 123
108+
}
109+
""".utf8), nil)
89110
case "revoke:good":
90111
return (nil, nil)
91112
default:

0 commit comments

Comments
 (0)