fix login

This commit is contained in:
anlicheng 2026-03-23 23:54:20 +08:00
parent e60078a2db
commit 1ffea953bf
8 changed files with 103 additions and 114 deletions

View File

@ -0,0 +1,73 @@
//
// NetworkSession.swift
// punchnet
//
// Created by on 2026/3/23.
//
import Foundation
extension SDLAPIClient {
//
struct NetworkSession: Codable {
struct ExitNode: Codable {
let uuid = UUID().uuidString
let nnid: Int
let nodeName: String
enum CodingKeys: String, CodingKey {
case nnid
case nodeName = "node_name"
}
}
let accessToken: String
let username: String
let userType: String
let audit: Int
let networkId: Int
let networkName: String
let networkDomain: String
let exitNodes: [ExitNode]
// TODO
var networkUrl: String {
return "https://www.test.cn/id=\(self.networkId)"
}
enum CodingKeys: String, CodingKey {
case accessToken = "access_token"
case username
case userType = "user_type"
case audit
case networkId = "network_id"
case networkName = "network_name"
case networkDomain = "network_domain"
case exitNodes = "exit_node"
}
}
static func loginWithAccountAndPassword(username: String, password: String) async throws -> NetworkSession {
var params: [String: Any] = [
"username": username,
"password": password,
"system": SystemConfig.systemInfo,
"version": SystemConfig.version_name
]
params.merge(baseParams) {$1}
return try await SDLAPIClient.doPost(path: "/auth/login", params: params, as: NetworkSession.self)
}
static func loginWithToken(token: String) async throws -> NetworkSession {
var params: [String: Any] = [
"token": token,
"system": SystemConfig.systemInfo,
"version": SystemConfig.version_name
]
params.merge(baseParams) {$1}
return try await SDLAPIClient.doPost(path: "/auth/token", params: params, as: NetworkSession.self)
}
}

View File

@ -23,6 +23,12 @@ struct SDLAPIClient {
static var baseUrl: String = "https://punchnet.s5s8.com/api" static var baseUrl: String = "https://punchnet.s5s8.com/api"
static private let token: String = "H6p*2RfEu4ITcL" static private let token: String = "H6p*2RfEu4ITcL"
//
static let baseParams: [String: Any] = [
"client_id": SystemConfig.getClientId(),
"mac": SystemConfig.macAddressString(mac: SystemConfig.getMacAddress())
]
static func doPost<T: Decodable>(path: String, params: [String: Any], as: T.Type) async throws -> T { static func doPost<T: Decodable>(path: String, params: [String: Any], as: T.Type) async throws -> T {
let postData = try! JSONSerialization.data(withJSONObject: params) let postData = try! JSONSerialization.data(withJSONObject: params)
var request = URLRequest(url: URL(string: baseUrl + path)!) var request = URLRequest(url: URL(string: baseUrl + path)!)

View File

@ -16,7 +16,7 @@ class AppContext {
var networkContext: NetworkContext? var networkContext: NetworkContext?
// //
enum AppScene { enum AppScene: Equatable {
case login(username: String?) case login(username: String?)
case logined case logined
case register case register

View File

@ -172,7 +172,7 @@ struct LoginAccountView: View {
} }
do { do {
_ = try await userContext.loginWithAccountAndPassword(username: username, password: password) _ = try await userContext.loginWith(credit: .accountAndPasword(account: username, password: password))
withAnimation(.spring(duration: 0.6, bounce: 0.2)) { withAnimation(.spring(duration: 0.6, bounce: 0.2)) {
self.appContext.appScene = .logined self.appContext.appScene = .logined
} }
@ -234,10 +234,13 @@ struct LoginTokenView: View {
} }
do { do {
_ = try await userContext.loginWithToken(token: token) _ = try await userContext.loginWith(credit: .token(token: token))
withAnimation(.spring(duration: 0.6, bounce: 0.2)) { withAnimation(.spring(duration: 0.6, bounce: 0.2)) {
self.appContext.appScene = .logined self.appContext.appScene = .logined
} }
} catch let err as SDLAPIError {
self.showAlert = true
self.errorMessage = err.message
} catch let err { } catch let err {
self.showAlert = true self.showAlert = true
self.errorMessage = err.localizedDescription self.errorMessage = err.localizedDescription

View File

@ -111,7 +111,7 @@ class NetworkModel {
} }
} }
func connect(networkSession: UserContext.NetworkSession) async throws -> NetworkContext { func connect(networkSession: SDLAPIClient.NetworkSession) async throws -> NetworkContext {
let params: [String: Any] = [ let params: [String: Any] = [
"client_id": SystemConfig.getClientId(), "client_id": SystemConfig.getClientId(),
"access_token": networkSession.accessToken "access_token": networkSession.accessToken

View File

@ -19,7 +19,7 @@ struct RootView: View {
Group { Group {
switch appContext.appScene { switch appContext.appScene {
case .login(username: let username): case .login(username: let username):
LoginView() LoginView(username: username)
case .logined: case .logined:
NetworkView() NetworkView()
case .register: case .register:

View File

@ -10,7 +10,7 @@ struct SettingsNetworkView: View {
@Environment(UserContext.self) var userContext: UserContext @Environment(UserContext.self) var userContext: UserContext
@Environment(\.openURL) var openURL @Environment(\.openURL) var openURL
@State private var selectedExitNode: UserContext.NetworkSession.ExitNode? @State private var selectedExitNode: SDLAPIClient.NetworkSession.ExitNode?
var body: some View { var body: some View {
ScrollView(.vertical, showsIndicators: false) { ScrollView(.vertical, showsIndicators: false) {

View File

@ -11,126 +11,33 @@ import Observation
@Observable @Observable
class UserContext { class UserContext {
var loginCredit: Credit? var loginCredit: Credit?
var networkSession: NetworkSession? var networkSession: SDLAPIClient.NetworkSession?
enum Credit { enum Credit {
case token(token: String) case token(token: String)
case accountAndPasword(account: String, password: String) case accountAndPasword(account: String, password: String)
} }
// func loginWith(credit: Credit) async throws -> Bool {
struct NetworkSession: Codable { switch credit {
struct ExitNode: Codable { case .token(let token):
let uuid = UUID().uuidString self.networkSession = try await SDLAPIClient.loginWithToken(token: token)
let nnid: Int // keychain
let nodeName: String if let data = token.data(using: .utf8) {
try KeychainStore.shared.save(data, account: "token")
enum CodingKeys: String, CodingKey { }
case nnid case .accountAndPasword(let username, let password):
case nodeName = "node_name" self.networkSession = try await SDLAPIClient.loginWithAccountAndPassword(username: username, password: password)
// keychain
if let data = "\(username):\(password)".data(using: .utf8) {
try KeychainStore.shared.save(data, account: "accountAndPasword")
} }
} }
self.loginCredit = credit
let accessToken: String
let username: String
let userType: String
let audit: Int
let networkId: Int
let networkName: String
let networkDomain: String
let exitNodes: [ExitNode]
var networkUrl: String {
return "https://www.test.cn/id=\(self.networkId)"
}
enum CodingKeys: String, CodingKey {
case accessToken = "access_token"
case username
case userType = "user_type"
case audit
case networkId = "network_id"
case networkName = "network_name"
case networkDomain = "network_domain"
case exitNodes = "exit_node"
}
}
private let baseParams: [String: Any] = [
"client_id": SystemConfig.getClientId(),
"mac": SystemConfig.macAddressString(mac: SystemConfig.getMacAddress())
]
@MainActor
func loginWithAccountAndPassword(username: String, password: String) async throws -> Bool {
var params: [String: Any] = [
"username": username,
"password": password,
"system": SystemConfig.systemInfo,
"version": SystemConfig.version_name
]
params.merge(baseParams) {$1}
self.networkSession = try await SDLAPIClient.doPost(path: "/auth/login", params: params, as: NetworkSession.self)
self.loginCredit = .accountAndPasword(account: username, password: password)
// keychain
if let data = "\(username):\(password)".data(using: .utf8) {
try KeychainStore.shared.save(data, account: "accountAndPasword")
}
return true return true
} }
@MainActor
func loginWithToken(token: String) async throws -> Bool {
var params: [String: Any] = [
"token": token,
"system": SystemConfig.systemInfo,
"version": SystemConfig.version_name
]
params.merge(baseParams) {$1}
self.networkSession = try await SDLAPIClient.doPost(path: "/auth/token", params: params, as: NetworkSession.self)
self.loginCredit = .token(token: token)
// keychain
if let data = token.data(using: .utf8) {
try KeychainStore.shared.save(data, account: "token")
}
return true
}
// func sendVerifyCode(username: String) async throws -> String {
// var params: [String: Any] = [
// "username": username
// ]
// params.merge(baseParams) {$1}
//
// return try await SDLAPIClient.doPost(path: "/auth/sendVerifyCode", params: params, as: String.self)
// }
//
// func submitVerifyCode(username: String, verifyCode: String) async throws -> String {
// var params: [String: Any] = [
// "username": username,
// "verify_code": verifyCode,
// ]
// params.merge(baseParams) {$1}
//
// return try await SDLAPIClient.doPost(path: "/auth/submitVerifyCode", params: params, as: String.self)
// }
//
// func resetPassword(username: String, password: String) async throws -> String {
// var params: [String: Any] = [
// "username": username,
// "password": password,
// ]
// params.merge(baseParams) {$1}
//
// return try await SDLAPIClient.doPost(path: "/auth/resetPassword", params: params, as: String.self)
// }
func loadCacheToken() -> String? { func loadCacheToken() -> String? {
if let data = try? KeychainStore.shared.load(account: "token") { if let data = try? KeychainStore.shared.load(account: "token") {
return String(data: data, encoding: .utf8) return String(data: data, encoding: .utf8)