From c26b5c2c6c327bc2419435b0ec3ec5c00f5828cb Mon Sep 17 00:00:00 2001 From: tsagano Date: Wed, 21 May 2025 16:03:33 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=82=A2=E3=82=A6=E3=83=88AP?= =?UTF-8?q?I=E3=81=AEcookie=E3=83=98=E3=83=83=E3=83=80=E3=81=AB=E3=82=BB?= =?UTF-8?q?=E3=83=83=E3=82=B7=E3=83=A7=E3=83=B3API=E3=81=AE=E3=83=AC?= =?UTF-8?q?=E3=82=B9=E3=83=9D=E3=83=B3=E3=82=B9cookie=E3=81=8C=E5=85=A5?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AgileWorks/App/RootViewController.swift | 1 + .../WebView/View/WebViewController.swift | 5 ++-- .../Common/DataStore/KeychainDataStore.swift | 26 ++++++++++++++++--- AgileWorks/Common/WebClient/APIEndpoint.swift | 8 +++--- .../Common/WebClient/GetLogoutEndpoint.swift | 4 +-- .../Common/WebClient/GetSessionEndpoint.swift | 2 +- 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/AgileWorks/AgileWorks/App/RootViewController.swift b/AgileWorks/AgileWorks/App/RootViewController.swift index e6712b7..d88c6de 100644 --- a/AgileWorks/AgileWorks/App/RootViewController.swift +++ b/AgileWorks/AgileWorks/App/RootViewController.swift @@ -109,6 +109,7 @@ extension RootViewController { KeychainDataStore().removeAccessToken(serverNumber: serverNumber) KeychainDataStore().removeDeviceID(serverNumber: serverNumber) KeychainDataStore().removeSessionID(serverNumber: serverNumber) + KeychainDataStore().removeSessionAPICookie(serverNumber: serverNumber) KeychainDataStore().removeCookieHeader(serverNumber: serverNumber) } //認証情報削除 diff --git a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift index 106cc37..22768dd 100644 --- a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift @@ -167,7 +167,7 @@ class WebViewController: UIViewController { // WebView ロード処理 private func loadWebView(url: String) { var requestCookie = "" - if let cookieHeader = KeychainDataStore().readCookieHeader(){ + if let cookieHeader = KeychainDataStore().readSessionAPICookie(){ let individualCookies = self.separateCookieHeader(cookieHeader: cookieHeader) for cookie in individualCookies { let componentCookies = cookie.components(separatedBy: ";") @@ -178,6 +178,7 @@ class WebViewController: UIViewController { } } } + KeychainDataStore().writeCookieHeader(cookieHeader: requestCookie) let url = URL(string: url)! var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30.0) request.httpShouldHandleCookies = false @@ -228,7 +229,7 @@ class WebViewController: UIViewController { let cookieStore = self.mainWebView.configuration.websiteDataStore.httpCookieStore cookieStore.setCookie(cookie!) - if let cookieHeader = KeychainDataStore().readCookieHeader(){ + if let cookieHeader = KeychainDataStore().readSessionAPICookie(){ let individualCookies = self.separateCookieHeader(cookieHeader: cookieHeader) for cookie in individualCookies { var cookiePath = "" diff --git a/AgileWorks/Common/DataStore/KeychainDataStore.swift b/AgileWorks/Common/DataStore/KeychainDataStore.swift index d6de3c2..6dd7f76 100644 --- a/AgileWorks/Common/DataStore/KeychainDataStore.swift +++ b/AgileWorks/Common/DataStore/KeychainDataStore.swift @@ -21,6 +21,7 @@ final class KeychainDataStore: DataStoreProtocol { private let kSessionID: String = "SessionID" private let kSystemName: String = "SystemName" private let kCertificateLabel: String = "CertificateLabel" + private let kSessionAPICookie: String = "SessionAPICookie" private let kCookieHeader: String = "CookieHeader" // アクセストークンの書き込み @@ -177,17 +178,36 @@ final class KeychainDataStore: DataStoreProtocol { } } - // cookieの書き込み + // セッションAPIのcookieの書き込み + func writeSessionAPICookie(sessionAPICookie: String) { + setKeychainValue(key: kSessionAPICookie, value: sessionAPICookie) + } + + // セッションAPIのcookieの読み込み + func readSessionAPICookie() -> String? { + return getKeychainValue(key: kSessionAPICookie) + } + + // セッションAPIのcookieの削除 + func removeSessionAPICookie(serverNumber: Int? = nil) { + if let serverNumber = serverNumber { + removeKeychainValue(key: kSessionAPICookie, serverNumber: serverNumber) + } else { + removeKeychainValue(key: kSessionAPICookie) + } + } + + // セットするcookieの書き込み func writeCookieHeader(cookieHeader: String) { setKeychainValue(key: kCookieHeader, value: cookieHeader) } - // cookieの読み込み + // セットするcookieの読み込み func readCookieHeader() -> String? { return getKeychainValue(key: kCookieHeader) } - // cookieの削除 + // セットするcookieの削除 func removeCookieHeader(serverNumber: Int? = nil) { if let serverNumber = serverNumber { removeKeychainValue(key: kCookieHeader, serverNumber: serverNumber) diff --git a/AgileWorks/Common/WebClient/APIEndpoint.swift b/AgileWorks/Common/WebClient/APIEndpoint.swift index 1ef653c..2e5127e 100644 --- a/AgileWorks/Common/WebClient/APIEndpoint.swift +++ b/AgileWorks/Common/WebClient/APIEndpoint.swift @@ -24,7 +24,7 @@ public protocol APIEndpoint { var method: HttpMethod { get } var path: String { get } var headerFields: [String: String]? { get } - var cookieFields: [String: String]? { get } + var cookieFields: [String]? { get } var pathParameters: [String]? { get } var queryParameters: [String: String]? { get } @@ -46,7 +46,7 @@ public extension APIEndpoint { return nil } - var cookieFields: [String: String]? { + var cookieFields: [String]? { return nil } @@ -77,8 +77,8 @@ public extension APIEndpoint { req.httpBody = requestBody req.httpShouldHandleCookies = false // cookies の設定 - for(key, value) in cookieFields ?? [:] { - req.setValue(key + "=" + value, forHTTPHeaderField: "Cookie") + for(value) in cookieFields ?? [] { + req.setValue(value, forHTTPHeaderField: "Cookie") req.httpShouldHandleCookies = true } diff --git a/AgileWorks/Common/WebClient/GetLogoutEndpoint.swift b/AgileWorks/Common/WebClient/GetLogoutEndpoint.swift index d39aad5..c0181e2 100644 --- a/AgileWorks/Common/WebClient/GetLogoutEndpoint.swift +++ b/AgileWorks/Common/WebClient/GetLogoutEndpoint.swift @@ -21,8 +21,8 @@ struct GetLogoutEndpoint: APIEndpoint { "X-ATLED-AW-Device-Id": KeychainDataStore().readDeviceID()?.description ?? ""] } - var cookieFields: [String: String]? { - return ["JSESSIONID": KeychainDataStore().readSessionID() ?? ""] + var cookieFields: [String]? { + return [KeychainDataStore().readCookieHeader() ?? ""] } } diff --git a/AgileWorks/Common/WebClient/GetSessionEndpoint.swift b/AgileWorks/Common/WebClient/GetSessionEndpoint.swift index fa65907..e3e407f 100644 --- a/AgileWorks/Common/WebClient/GetSessionEndpoint.swift +++ b/AgileWorks/Common/WebClient/GetSessionEndpoint.swift @@ -39,7 +39,7 @@ extension GetSessionEndpoint { let headerSessionId = extractSessionId(from: headers) if headerSessionId == bodySessionId { print("CookieHeaders: \(headers)") - KeychainDataStore().writeCookieHeader(cookieHeader: headers) + KeychainDataStore().writeSessionAPICookie(sessionAPICookie: headers) } return decodedSessionInfo } catch { -- GitLab