iOS 부품에서 인증된 API 요청을 보내는 방법

iOS의 애플릿 확장에서 Keychain에 저장된 API 토큰을 읽고 인증된 API 요청을 보내는 방법을 요약해 봤다.
U-motionウィジェット

Keychain Sharing은 서로 다른 어플리케이션 간의 Keychain을 공유합니다.


인증된 API 요청을 iOS 부품으로 요청하고 싶지만 로그인 처리 등 UI를 사용할 수 없습니다.로그인 처리는 프로그램에서 진행되며, 어떤 방식으로 세션 영패 등 인증 정보를 작은 프로그램에 공유할 수 있습니다.이번에는 Keychain을 사용했습니다.
iOS에서 애플리케이션 호스트와 애플릿 확장은 서로 다른 애플리케이션으로 간주되므로 애플리케이션이 관리하는 Keychain에 작은 애플리케이션에서 액세스할 수 없습니다."Keychain Sharing을 사용하여 응용 프로그램에서""공유""Keychain이 필요합니다."
https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps
Keychain Sharing에 대해 이 글을 참고했습니다.
https://evgenii.com/blog/sharing-keychain-in-ios/

응용 프로그램 본체를 활성화하는 Keychain Sharing


Capabilities 구성


Xcode에서 항목을 선택한 후 응용 프로그램 바디의 대상을 선택하고 "Capabilities"탭에 "Keychain Sharing"을 추가합니다.
키샤인 그룹란에는 이번에 공유한 키샤인의 그룹명이 추가됐다.WidgetSharing Group으로

Enitlements 설정


Enitlements를 열고 Keychain Access Group 키를 추가합니다. 값은 $(AppIdentifier Prefix) WidgetSharing Group입니다.이 문자열은 방금 Capabilities에서 설정한 그룹 이름 앞에 적용 ID를 삽입하는 문자열입니다.
Keychain Access Group에는 Application ID(Team ID)가 포함되어야 하므로 Keychain의 공개 범위는 동일한 소스의 애플리케이션으로 제한됩니다.

애플릿 확장에서 Keychain Sharing 사용


Widget에서도 Keychain Sharing을 활성화해야 합니다.Xcode 대상에서 Widget Extension을 선택하여 응용 프로그램 자체와 마찬가지로 Keychain Sharing을 설정합니다.Keychain의 그룹 이름은 응용 프로그램 바디와 같습니다.

부품 코드로 공유된 Keychain 액세스


KeychainAccess 가져오기


부품에서 Keychain에 액세스하기 위해 Cocoapeds의 KeychainAccess를 가져왔습니다.
https://github.com/kishikawakatsumi/KeychainAccess
Podfile에 설명을 추가하여 부품에 CocoPods 패키지를 도입합니다.
Podfile
target 'WidgetExtension' do
  use_frameworks!
  pod 'KeychainAccess', '~> 4.2'  
end

getTimeline()에서 Keychain 액세스


부품 컨텐트는 getTimeline()에서 생성됩니다.KeychainAccess를 사용하십시오.매개변수 "accessGroup"에서 응용 프로그램 주체가 공유하는 Keychain 그룹을 지정합니다.
Widget.swift

struct SessionToken: Codable {
  var sessionToken: String
  var expiredAt: Int
  var refreshToken: String
}

func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {...途中省略...let keychain = Keychain(service: "app", accessGroup: "(Entitilementsに追加した、AppIDを含むグループ名)")
  let result = try! keychain.getData("(取得したいデータのキー)")
  
  guard let sessionTokenJSON = result else { return }
  let decoder = JSONDecoder()
  let sessionToken = try? decoder.decode(SessionToken.self, from: sessionTokenJSON)
}

총결산


부품의 타임라인이 생성되면 Keychain에서 세션 토큰을 꺼낼 수 있습니다.이 토큰을 사용하여 API 서버에 액세스하여 표시 데이터를 얻을 수 있습니다.
로그인 화면을 설치할 수 없는 iOS 애플릿에 인증 API 요청이 허용되었습니다.이 글은 토큰 리셋 등의 처리를 생략했지만, 위젯에서 토큰이 업데이트되면 새 토큰 주체가 적용하는 KeyChain에 다시 기록해야 한다.

이 블로그를 처음 읽는 사람에게: U-motion은 무엇입니까?


유모션은 소 목에 있는 센서를 이용해 활동 내용을 기록하고, AI의 힘으로 건강 상태를 분석해 축산 농가의 감시 시스템을 지원한다.
U-motion Development 는
  • 센서에서 수집한 데이터를 처리하는 백엔드 시스템
  • React 기반 웹 응용
  • , 데이터 도표화
  • 리액트 네이티브 기반 스마트폰 애플리케이션
  • 이 경보를 통해 소의 건강 상태 변화를 알린다
    개발 중입니다.이 계정은 개발 당시 얻은 지식을 공개했다.
    https://www.desamis.co.jp/product/

    좋은 웹페이지 즐겨찾기