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

@ -28,7 +28,7 @@ class KeychainStore {
kSecAttrServer as String: self.serverId,
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) }
}
@ -41,7 +41,7 @@ class KeychainStore {
kSecReturnData as String: true]
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 == errSecSuccess else { throw KeychainError.unhandledError(status: status) }
@ -59,7 +59,7 @@ class KeychainStore {
let query: [String: Any] = [kSecClass as String: kSecClassInternetPassword,
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) }
}

Loading…
Cancel
Save