2022.11.23개발일지2022. 11. 24. 09:50
Table of Contents
Today I Learned
- 개발새발(iOS) 깃허브 토큰을 키체인에 저장하는 기능을 구현
class KeyChain {
enum KeychainError : Error{
case duplicateEntry
case unknown(OSStatus)
}
static func save(
service : String,
account : String,
password : Data
) throws {
let query : [String : AnyObject] = [
kSecClass as String : kSecClassGenericPassword,
kSecAttrService as String : service as AnyObject,
kSecAttrAccount as String : account as AnyObject,
kSecValueData as String : password as AnyObject
]
let status = SecItemAdd(query as CFDictionary, nil)
guard status != errSecDuplicateItem else {
throw KeychainError.duplicateEntry
}
guard status == errSecSuccess else{
throw KeychainError.unknown(status)
}
print("saved")
}
static func get(
service : String,
account : String
) ->Data? {
let query : [String : AnyObject] = [
kSecClass as String : kSecClassGenericPassword,
kSecAttrService as String : service as AnyObject,
kSecAttrAccount as String : account as AnyObject,
kSecReturnData as String : kCFBooleanTrue,
kSecMatchLimit as String : kSecMatchLimitOne
]
var result : AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &result)
print("Read status : \(status)")
return result as? Data
}
static func updateKey(value: Any, service:Any,account: Any) -> Bool {
let prevQuery: [CFString: Any] = [kSecClass: kSecClassGenericPassword,kSecAttrService : service,
kSecAttrAccount: account]
let updateQuery: [CFString: Any] = [kSecValueData: (value as AnyObject).data(using: String.Encoding.utf8.rawValue) as Any]
let result: Bool = {
let status = SecItemUpdate(prevQuery as CFDictionary, updateQuery as CFDictionary)
if status == errSecSuccess { return true }
print("updateItem Error : \(status.description)")
return false
}()
return result
}
}
Keychain class 메소드를 일반함수로 쉽게 접근하기 위해 함수 별도로 생성
func updateKey(updatekey: String) -> Bool{
var result = false
result = KeyChain.updateKey(value: updatekey, service: "ser1", account: "userToken")
return result
}
func getKey(account: String) -> String{
guard let data = KeyChain.get(service: "ser1", account: account) else{
print("Failed to read key")
return ""
}
let key = String(decoding: data, as: UTF8.self)
print("Read Key : \(key)")
return key
}
func save(account : String,pw : String){
do{
try KeyChain.save(service: "ser1", account: account, password: pw.data(using: .utf8) ?? Data())
}catch{
print(error)
}
}
'개발일지' 카테고리의 다른 글
미니프로젝트 회고 (0) | 2024.07.19 |
---|---|
BastionHost를 이용한 EC2 SSH 접속 (0) | 2024.04.07 |
테스트 H2 DB DATEDIFF 메서드 안됨 (0) | 2024.02.07 |
[개발일지] 접속관련 FCM 메세지 전송 기준 개선 (0) | 2024.01.28 |
우분투 mysql 한글 깨짐 (0) | 2023.04.06 |
@gani+ :: Gani_Dev :)
꾸준히 기록할 수 있는 사람이 되자 !