fix: send auth token with sentence boundary API requests
This commit is contained in:
Binary file not shown.
@@ -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 = ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) ?? ""
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user