Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Backend 연결 (ERDv0.3) 및 기록동기화 구현 #62

Merged
merged 37 commits into from
Jan 16, 2023
Merged

Conversation

minsangKang
Copy link
Member

작업 내용

  • Test 용 로그인 구현 (username, password, email)
  • keychain 구현
  • backend 로직 연결
    • auth
    • daily
    • syncLog
    • recordTime
  • sync dailys 화면 구현
  • sync 로직 구현
    • uploadDailys
    • getDailys
    • checkRecordTimes
    • uploadRecordtime
    • getRecordTime
    • getSyncLog
    • saveDailys
    • saveRecordTimes
    • saveLastUploadedDate
  • retry 로직 구현 (token 만료시 재 로그인)
  • mac 용 지원하는 keychain 으로 수정
  • device 이미지 수정
  • email 발송 로직 구현

동작 화면

화면1 화면2 화면3

기록동기화 로직

  1. uploadDailys (server 내에서 병합된다)
  2. getDailys (전체 [Daily] fetch)
  3. checkRecordTimes
    -> RecordTimes 의 recordStartAt 값과 마지막 Daily의 startDate 값을 확인한 후
    같은 경우: uploadRecordTime
    다른 경우: getRecordTime
  4. getSyncLog (server 내 Dailys 수 & 동기화 시각 fetch)

server ERD 상태

Keychain

  • Mac & iOS 모두 Keychain 이 되는 구조여야만 했다. -> SecItem API 방식이 유일 (Data protection keychain)
  • 처음에는 SwiftKeychainWrapper 외부라이브러리를 사용하려 했으나 Mac에서 동작되지 않는 상태라 라이브러리 없이 작성. -> Signing & Capabilities : Keychain Sharing 설정이 안되어서 안되지 않았을까 추측

  • 최종적으로 save, get, update, deleteAll, delete 함수를 작성 후 Singleton 형식의 클래스를 통해 사용하는 식으로 구현.

kSecClassGenericPassword

  • kSecClass(키체인 아이템의 타입) 값에 따라 사용할 수 있는 속성들이 달랐다.
  • Apple 공식문서의 예시코드의 경우 kSecClassInternetPassword 를 사용하였기에 kSecValueData 속성을 통해 password 를 저장하는 식의 구조였으나
  • password 뿐만이 아닌 다양한 값들을 Keychain 에 저장하는 용이라 생각하여 kSecClassGenericPassword 를 사용하였기에 kSecAttrGeneric 속성을 통해 값을 저장하는 구조가 되었다.
  • KeychainItem 형식은 kSecAttrService(앱 Bundle identifier), kSecAttrAccount(저장대상 아이템 이름), kSecAttrGeneric(저장대상 값) 구조가 되었다.
    • keyChain[{ kSecAttrService, kSecAttrAccount }] = kSecAttrGeneric` 식으로 구현.
let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                    kSecAttrService as String: service,
                                    kSecAttrAccount as String: key.rawValue,
                                    kSecAttrGeneric as String: valueData]

Token 관리

  • 현재 테스트서버 기록동기화 기능의 경우 username, password, email 통해 회원가입하는 절차로 구현
    • server 내에서 username, password 를 통해 user 검색
    • user id 값을 token(jwt) 내 설정 후 반환
  • Bearer Token 설정과 Token 재발급을 위한 NetworkInterceptor 생성
  • adapt 함수에서 Bearer Token 설정
  • retry 함수에서 statusCode 값이 401(AUTHENTICATION) 인 경우
    • Keychain 에서 username, password 를 get 하여 login
    • login 완료 후 수신받은 새로운 token 값을 Keychain 에 save 한 후 API 다시 시도

레퍼런스

SwiftKeychainWrapper
Adding a Password to the Keychain
On Mac keychain APIs and implementations
키체인 간단 사용법
Alamofire 사용 방법 - 토큰 갱신 방법1 (Interceptor, adapt, retry)
Alamofire 사용 방법 - 토큰 갱신 (AuthenticationCredential, Authenticator, AuthenticationInterceptor)

@minsangKang minsangKang added refactor 코드 리펙토링 feature 기능 추가/변경/삭제 Design labels Jan 16, 2023
@minsangKang minsangKang self-assigned this Jan 16, 2023
@minsangKang minsangKang merged commit 837e0c3 into dev Jan 16, 2023
@minsangKang minsangKang deleted the feature/Backend branch January 16, 2023 02:03
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
feature 기능 추가/변경/삭제 refactor 코드 리펙토링
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant