Add service to login and get user

multistore
Laurent 2 years ago
parent a277ac80fe
commit cdbd9566c9
  1. 37
      LeStorage/Services.swift
  2. 6
      LeStorage/Store.swift
  3. 6
      LeStorage/Utils/KeychainStore.swift

@ -83,6 +83,10 @@ public class Services {
var request = URLRequest(url: url) var request = URLRequest(url: url)
request.httpMethod = method.rawValue request.httpMethod = method.rawValue
request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// if let token = try? self.keychainStore.getToken() {
// request.addValue("Token \(token)", forHTTPHeaderField: "Authorization")
// }
return request return request
} }
@ -124,22 +128,31 @@ public class Services {
let user = User(username: username, password: password, email: email) let user = User(username: username, password: password, email: email)
postRequest.httpBody = try jsonEncoder.encode(user) postRequest.httpBody = try jsonEncoder.encode(user)
let _: User = try await self.runRequest(postRequest) let _: User = try await self.runRequest(postRequest)
let _ = try await requestToken(user: user) let _ = try await requestToken(username: username, password: password)
} }
func requestToken(user: User) async throws -> String { func requestToken(username: String, password: String) async throws -> String {
var postRequest = try self._baseRequest(servicePath: "api-token-auth/", method: .post) var postRequest = try self._baseRequest(servicePath: "plus/api-token-auth/", method: .post)
postRequest.httpBody = try jsonEncoder.encode(user) let credentials = Credentials(username: username, password: password)
postRequest.httpBody = try jsonEncoder.encode(credentials)
let response: AuthResponse = try await self.runRequest(postRequest) let response: AuthResponse = try await self.runRequest(postRequest)
try self.keychainStore.add(username: user.username, token: response.token) do {
try self.keychainStore.add(username: username, token: response.token)
} catch {
Logger.error(error)
}
return response.token return response.token
} }
public func login(username: String, password: String) async throws -> User { public func login(username: String, password: String) async throws -> User {
var postRequest = try self._baseRequest(servicePath: "users/", method: .post) let token: String = try await requestToken(username: username, password: password)
let credentials = Credentials(username: username, password: password) Logger.log("token = \(token)")
postRequest.httpBody = try jsonEncoder.encode(credentials) var postRequest = try self._baseRequest(servicePath: "plus/user-by-token/", method: .post)
return try await self.runRequest(postRequest) postRequest.httpBody = try jsonEncoder.encode(Token(token: token))
let user: User = try await self.runRequest(postRequest)
Logger.log("user = \(user.username), id = \(user.id)")
Store.main.setUserUUID(uuidString: user.id)
return user
} }
func forgotPassword(user: User) async throws { func forgotPassword(user: User) async throws {
@ -150,8 +163,6 @@ public class Services {
// let _ = try await requestToken(credentials: credentials) // let _ = try await requestToken(credentials: credentials)
// return response // return response
} }
} }
@ -164,6 +175,10 @@ struct Credentials: Codable {
var password: String var password: String
} }
struct Token: Codable {
var token: String
}
public struct User: Codable { public struct User: Codable {
var id: String = Store.randomId() var id: String = Store.randomId()
var username: String var username: String

@ -87,6 +87,12 @@ public class Store {
} }
} }
func setUserUUID(uuidString: String) {
self.settingsStorage.update { settings in
settings.userUUID = UUID(uuidString: uuidString)
}
}
/// The service instance /// The service instance
public var service: Services? { public var service: Services? {
return self._services return self._services

@ -28,7 +28,7 @@ class KeychainStore {
kSecAttrServer as String: self.serverId, kSecAttrServer as String: self.serverId,
kSecValueData as String: tokenData] kSecValueData as String: tokenData]
let status = SecItemAdd(query as CFDictionary, nil) let status: OSStatus = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) } guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) }
} }
@ -41,7 +41,7 @@ class KeychainStore {
kSecReturnData as String: true] kSecReturnData as String: true]
var item: CFTypeRef? var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item) let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &item)
guard status != errSecItemNotFound else { throw KeychainError.noPassword } guard status != errSecItemNotFound else { throw KeychainError.noPassword }
guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) } guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) }
@ -59,7 +59,7 @@ class KeychainStore {
let query: [String: Any] = [kSecClass as String: kSecClassInternetPassword, let query: [String: Any] = [kSecClass as String: kSecClassInternetPassword,
kSecAttrServer as String: self.serverId] kSecAttrServer as String: self.serverId]
let status = SecItemDelete(query as CFDictionary) let status: OSStatus = SecItemDelete(query as CFDictionary)
guard status == errSecSuccess || status == errSecItemNotFound else { throw KeychainError.unhandledError(status: status) } guard status == errSecSuccess || status == errSecItemNotFound else { throw KeychainError.unhandledError(status: status) }
} }

Loading…
Cancel
Save