Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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 @@ -459,6 +459,8 @@ public LoginResponse refreshToken(String refreshToken) {
requestVO.put("refresh_token", refreshToken);
ResponseEntity<LoginResultResponse> responseEntity = webClient.post()
.uri(ServerUriConstant.REFRESH_TOKEN)
// support Https
.cookie("__Host-refresh_token", refreshToken)
.cookie("refresh_token", refreshToken)
.bodyValue(requestVO)
.retrieve()
Expand Down Expand Up @@ -498,14 +500,16 @@ private LoginResponse processLoginResult(LoginResultResponse result, List<String
if (loginResponse == null && setCookieHeaders != null) {
loginResponse = new LoginResponse();
for (String cookieHeader : setCookieHeaders) {
if (cookieHeader.startsWith("access_token=") && !cookieHeader.contains("access_token=;")) {
String accessToken = extractTokenValue(cookieHeader, "access_token=");
String accessToken = extractToken(cookieHeader, "access_token");
String refreshToken = extractToken(cookieHeader, "refresh_token");
String csrfToken = extractToken(cookieHeader, "csrf_token");
if (accessToken != null) {
loginResponse.setAccessToken(accessToken);
} else if (cookieHeader.startsWith("refresh_token=") && !cookieHeader.contains("refresh_token=;")) {
String refreshToken = extractTokenValue(cookieHeader, "refresh_token=");
}
if (refreshToken != null) {
loginResponse.setRefreshToken(refreshToken);
} else if (cookieHeader.startsWith("csrf_token=") && !cookieHeader.contains("csrf_token=;")) {
String csrfToken = extractTokenValue(cookieHeader, "csrf_token=");
}
if (csrfToken != null) {
loginResponse.setCsrfToken(csrfToken);
}
}
Expand All @@ -514,6 +518,33 @@ private LoginResponse processLoginResult(LoginResultResponse result, List<String
return loginResponse;
}

/**
* Extracts the token value for a specified key from the Cookie header.
* Supports both the standard key prefix and the secure "__Host-" prefix
* for compatibility. If the extracted value is empty (e.g., "access_token=;"),
* it returns null.
*
* @param cookieHeader The raw Cookie header string.
* @param key The name of the token to extract.
* @return The token value if present and non-empty; null otherwise.
*/
private String extractToken(String cookieHeader, String key) {
String prefix = key + "=";
String hostPrefix = "__Host-" + key + "=";

String value = null;
if (cookieHeader.startsWith(prefix)) {
value = extractTokenValue(cookieHeader, prefix);
} else if (cookieHeader.startsWith(hostPrefix)) {
value = extractTokenValue(cookieHeader, hostPrefix);
}

if (value != null && !value.isEmpty()) {
return value;
}
return null;
}

/**
* Extracts the token value from a cookie header string
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,8 @@ public LoginResponse refreshToken(String refreshToken) {
Map<String, String> requestVO = Map.of("refresh_token", refreshToken);
ResponseEntity<LoginResultResponse> responseEntity = restClient.post()
.uri(ServerUriConstant.REFRESH_TOKEN)
// support Https
.cookie("__Host-refresh_token", refreshToken)
.cookie("refresh_token", refreshToken)
.body(requestVO)
.retrieve()
Expand Down Expand Up @@ -476,14 +478,16 @@ private LoginResponse processLoginResult(LoginResultResponse result, List<String
if (loginResponse == null && setCookieHeaders != null) {
loginResponse = new LoginResponse();
for (String cookieHeader : setCookieHeaders) {
if (cookieHeader.startsWith("access_token=") && !cookieHeader.contains("access_token=;")) {
String accessToken = extractTokenValue(cookieHeader, "access_token=");
String accessToken = extractToken(cookieHeader, "access_token");
String refreshToken = extractToken(cookieHeader, "refresh_token");
String csrfToken = extractToken(cookieHeader, "csrf_token");
if (accessToken != null) {
loginResponse.setAccessToken(accessToken);
} else if (cookieHeader.startsWith("refresh_token=") && !cookieHeader.contains("refresh_token=;")) {
String refreshToken = extractTokenValue(cookieHeader, "refresh_token=");
}
if (refreshToken != null) {
loginResponse.setRefreshToken(refreshToken);
} else if (cookieHeader.startsWith("csrf_token=") && !cookieHeader.contains("csrf_token=;")) {
String csrfToken = extractTokenValue(cookieHeader, "csrf_token=");
}
if (csrfToken != null) {
loginResponse.setCsrfToken(csrfToken);
}
}
Expand All @@ -492,6 +496,33 @@ private LoginResponse processLoginResult(LoginResultResponse result, List<String
return loginResponse;
}

/**
* Extracts the token value for a specified key from the Cookie header.
* Supports both the standard key prefix and the secure "__Host-" prefix
* for compatibility. If the extracted value is empty (e.g., "access_token=;"),
* it returns null.
*
* @param cookieHeader The raw Cookie header string.
* @param key The name of the token to extract.
* @return The token value if present and non-empty; null otherwise.
*/
private String extractToken(String cookieHeader, String key) {
String prefix = key + "=";
String hostPrefix = "__Host-" + key + "=";

String value = null;
if (cookieHeader.startsWith(prefix)) {
value = extractTokenValue(cookieHeader, prefix);
} else if (cookieHeader.startsWith(hostPrefix)) {
value = extractTokenValue(cookieHeader, hostPrefix);
}

if (value != null && !value.isEmpty()) {
return value;
}
return null;
}

/**
* Extracts the token value from a cookie header string
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,8 @@ public LoginResponse refreshToken(String refreshToken) {
Map<String, String> requestVO = Map.of("refresh_token", refreshToken);
ResponseEntity<LoginResultResponse> responseEntity = restClient.post()
.uri(ServerUriConstant.REFRESH_TOKEN)
// support Https
.cookie("__Host-refresh_token", refreshToken)
.cookie("refresh_token", refreshToken)
.body(requestVO)
.retrieve()
Expand Down Expand Up @@ -507,14 +509,16 @@ private LoginResponse processLoginResult(LoginResultResponse result, List<String
if (loginResponse == null && setCookieHeaders != null) {
loginResponse = new LoginResponse();
for (String cookieHeader : setCookieHeaders) {
if (cookieHeader.startsWith("access_token=") && !cookieHeader.contains("access_token=;")) {
String accessToken = extractTokenValue(cookieHeader, "access_token=");
String accessToken = extractToken(cookieHeader, "access_token");
String refreshToken = extractToken(cookieHeader, "refresh_token");
String csrfToken = extractToken(cookieHeader, "csrf_token");
if (accessToken != null) {
loginResponse.setAccessToken(accessToken);
} else if (cookieHeader.startsWith("refresh_token=") && !cookieHeader.contains("refresh_token=;")) {
String refreshToken = extractTokenValue(cookieHeader, "refresh_token=");
}
if (refreshToken != null) {
loginResponse.setRefreshToken(refreshToken);
} else if (cookieHeader.startsWith("csrf_token=") && !cookieHeader.contains("csrf_token=;")) {
String csrfToken = extractTokenValue(cookieHeader, "csrf_token=");
}
if (csrfToken != null) {
loginResponse.setCsrfToken(csrfToken);
}
}
Expand All @@ -523,6 +527,33 @@ private LoginResponse processLoginResult(LoginResultResponse result, List<String
return loginResponse;
}

/**
* Extracts the token value for a specified key from the Cookie header.
* Supports both the standard key prefix and the secure "__Host-" prefix
* for compatibility. If the extracted value is empty (e.g., "access_token=;"),
* it returns null.
*
* @param cookieHeader The raw Cookie header string.
* @param key The name of the token to extract.
* @return The token value if present and non-empty; null otherwise.
*/
private String extractToken(String cookieHeader, String key) {
String prefix = key + "=";
String hostPrefix = "__Host-" + key + "=";

String value = null;
if (cookieHeader.startsWith(prefix)) {
value = extractTokenValue(cookieHeader, prefix);
} else if (cookieHeader.startsWith(hostPrefix)) {
value = extractTokenValue(cookieHeader, hostPrefix);
}

if (value != null && !value.isEmpty()) {
return value;
}
return null;
}

/**
* Extracts the token value from a cookie header string
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ public void addAuthorizationCookies(MultiValueMap<String, String> cookies, DifyS
}
cookies.add("access_token", accessToken);
cookies.add("csrf_token", csrfToken);
// support Https
cookies.add("__Host-access_token", accessToken);
cookies.add("__Host-csrf_token", csrfToken);
}

private void obtainToken(DifyServerClient difyServerClient) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ public void addAuthorizationCookies(MultiValueMap<String, String> cookies, DifyS
String csrfToken = redisTemplate.opsForValue().get(DifyRedisKey.CSRF_TOKEN);
cookies.add("access_token", accessToken);
cookies.add("csrf_token", csrfToken);
// support Https
cookies.add("__Host-access_token", accessToken);
cookies.add("__Host-csrf_token", csrfToken);
}

private String obtainToken(DifyServerClient difyServerClient) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,8 @@ void testAddAuthorizationCookiesWithNoToken() {
verify(difyServerClient).login();
verify(cookies).add("access_token", "test-access-token");
verify(cookies).add("csrf_token", "test-csrf-token");
verify(cookies).add("__Host-access_token", "test-access-token");
verify(cookies).add("__Host-csrf_token", "test-csrf-token");
}

@Test
Expand All @@ -305,6 +307,8 @@ void testAddAuthorizationCookiesWithExistingToken() {
verify(difyServerClient).login();
verify(initialCookies).add("access_token", "test-access-token");
verify(initialCookies).add("csrf_token", "test-csrf-token");
verify(initialCookies).add("__Host-access_token", "test-access-token");
verify(initialCookies).add("__Host-csrf_token", "test-csrf-token");

// Reset difyServerClient mock
reset(difyServerClient);
Expand All @@ -319,5 +323,7 @@ void testAddAuthorizationCookiesWithExistingToken() {
verify(difyServerClient, never()).login(); // Should not call login again
verify(secondCookies).add("access_token", "test-access-token");
verify(secondCookies).add("csrf_token", "test-csrf-token");
verify(secondCookies).add("__Host-access_token", "test-access-token");
verify(secondCookies).add("__Host-csrf_token", "test-csrf-token");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,8 @@ void testAddAuthorizationCookiesWithTokenInRedis() {
verify(difyServerClient, never()).login();
verify(cookies).add("access_token", "redis-access-token");
verify(cookies).add("csrf_token", "redis-csrf-token");
verify(cookies).add("__Host-access_token", "redis-access-token");
verify(cookies).add("__Host-csrf_token", "redis-csrf-token");
}

@Test
Expand Down Expand Up @@ -295,5 +297,7 @@ void testAddAuthorizationCookiesWithoutTokenInRedis() {
verify(valueOperations).set(eq(DifyRedisKey.CSRF_TOKEN), eq("new-csrf-token"));
verify(cookies).add("access_token", "new-access-token");
verify(cookies).add("csrf_token", null);
verify(cookies).add("__Host-access_token", "new-access-token");
verify(cookies).add("__Host-csrf_token", null);
}
}
Loading