fix: send auth token with sentence boundary API requests

This commit is contained in:
2026-09-01 08:41:52 +08:00
parent 09fbe8a2de
commit 1adba4d227
5 changed files with 17 additions and 3 deletions

View File

@@ -17,4 +17,7 @@ enum AppConfig {
static let assessmentTimeout: TimeInterval = 180 static let assessmentTimeout: TimeInterval = 180
static let sha256Pattern = #"^[0-9a-fA-F]{64}$"# static let sha256Pattern = #"^[0-9a-fA-F]{64}$"#
/// 当前登录用户的认证 token,由 AuthManager 在登录/注销时设置。
static var authToken: String = ""
} }

View File

@@ -25,14 +25,17 @@ enum HTTPClient {
_ type: T.Type, _ type: T.Type,
baseURL: String, baseURL: String,
path: String, path: String,
timeout: TimeInterval timeout: TimeInterval,
additionalHeaders: [String: String] = [:]
) async throws -> (value: T, effectiveBaseURL: String) { ) async throws -> (value: T, effectiveBaseURL: String) {
var headers = ["Accept": "application/json"]
headers.merge(additionalHeaders) { _, new in new }
let result = try await execute( let result = try await execute(
baseURL: baseURL, baseURL: baseURL,
path: path, path: path,
method: "GET", method: "GET",
timeout: timeout, timeout: timeout,
headers: ["Accept": "application/json"] headers: headers
) )
guard (200...299).contains(result.statusCode) else { guard (200...299).contains(result.statusCode) else {
let body = String(data: result.body, encoding: .utf8) ?? "" let body = String(data: result.body, encoding: .utf8) ?? ""

View File

@@ -20,11 +20,16 @@ enum SentenceBoundaryAPI {
guard hash.range(of: AppConfig.sha256Pattern, options: .regularExpression) != nil else { guard hash.range(of: AppConfig.sha256Pattern, options: .regularExpression) != nil else {
throw SentenceBoundaryAPIError.invalidHash throw SentenceBoundaryAPIError.invalidHash
} }
var headers: [String: String] = [:]
if !AppConfig.authToken.isEmpty {
headers["Authorization"] = "Bearer \(AppConfig.authToken)"
}
let result = try await HTTPClient.getJSON( let result = try await HTTPClient.getJSON(
SentenceBoundaryDocument.self, SentenceBoundaryDocument.self,
baseURL: AppConfig.serverBaseURL, baseURL: AppConfig.serverBaseURL,
path: "api/v1/videos/\(hash)/sentence-boundaries", path: "api/v1/videos/\(hash)/sentence-boundaries",
timeout: AppConfig.readTimeout timeout: AppConfig.readTimeout,
additionalHeaders: headers
) )
guard result.value.videoHash.lowercased() == hash else { guard result.value.videoHash.lowercased() == hash else {
throw SentenceBoundaryAPIError.hashMismatch throw SentenceBoundaryAPIError.hashMismatch

View File

@@ -15,6 +15,7 @@ final class AuthManager: ObservableObject {
let defaults = UserDefaults.standard let defaults = UserDefaults.standard
token = defaults.string(forKey: "oral_trainer_token") ?? "" token = defaults.string(forKey: "oral_trainer_token") ?? ""
nickname = defaults.string(forKey: "oral_trainer_nickname") ?? "" nickname = defaults.string(forKey: "oral_trainer_nickname") ?? ""
AppConfig.authToken = token
} }
var isLoggedIn: Bool { !token.isEmpty } var isLoggedIn: Bool { !token.isEmpty }
@@ -22,6 +23,7 @@ final class AuthManager: ObservableObject {
func saveSession(_ session: AuthSession) { func saveSession(_ session: AuthSession) {
token = session.token token = session.token
nickname = session.user.nickname nickname = session.user.nickname
AppConfig.authToken = session.token
let defaults = UserDefaults.standard let defaults = UserDefaults.standard
defaults.set(session.token, forKey: "oral_trainer_token") defaults.set(session.token, forKey: "oral_trainer_token")
defaults.set(session.user.nickname, forKey: "oral_trainer_nickname") defaults.set(session.user.nickname, forKey: "oral_trainer_nickname")
@@ -30,6 +32,7 @@ final class AuthManager: ObservableObject {
func logout() { func logout() {
token = "" token = ""
nickname = "" nickname = ""
AppConfig.authToken = ""
showingRegister = false showingRegister = false
showingSSO = false showingSSO = false
showingPhoneBinding = false showingPhoneBinding = false