관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Login] 카카오로 로그인 본문

OAuth Login

[iOS - Login] 카카오로 로그인

jake-kim 2020. 7. 1. 17:08

(id를 10자리로 표현하는 특징)


1. OAuth 2.0

- 카카오 로그인은 두 단계로 진행 : 로그인 인증 코드 받기, 사용자 토큰 발급

- iOS에서 Redirect URI를 앱정보에 등록(인증 코드를 받아 사용자 토큰 발급을 요청하는 역할)

OAuth 2.0

2. 사용

1) 앱 등록, 플랫폼 설정

developers.kakao.com/docs/latest/ko/getting-started/app

등록된 네이티브 키를 통해 API사용

 

2) iOS SDK 다운 - Full SDK Binary & Samples

developers.kakao.com/docs/latest/ko/sdk-download/ios-v1

 

3) 앱에 로그인 관련 프레임워크 import (Frameworks 그룹에 드래그앤드롭)

위 폴더를 import

4) "-all_Load" 추가

3. 프로젝트 내 앱 설정

1) URL Types 항목 추가

- KAKAO_APP_KEY(네이티브 앱 키)앞에 "kakao"라는 문자열을 붙여서 등록

   (내 애플리케이션 -> 앱 설정 -> 앱 키)

- 카카오계정을 통해 인증받고 자신의 앱 실행을 위함

2) info.plist에 키 정보 추가

key는 "KAKAO_APP_KEY"

value는 네이티브 앱 키 값

3) info.plist에 내용 추가

- 공통은 "kakao"를 붙 네이티브 앱 키

    <key>LSApplicationQueriesSchemes</key>
    <array>
            <!-- 공통 -->
            <string>kakao89efdb181d581eb59f3510ea8f245f29</string>
            
            <!-- 간편로그인 -->
            <string>kakaokompassauth</string>
            <string>storykompassauth</string>
            
            <!-- 카카오톡링크 -->
            <string>kakaolink</string>
            <string>kakaotalk-5.9.7</string>
            
            <!-- 카카오스토리링크 -->
            <string>storylink</string>
    </array>

4) Bridging_Header추가

samples -> swift -> kakaoSample -> "KakaoOpenSDK-Bridging-Hedaer.h" 파일을 프로젝트에 추가

#import <KakaoMessage...> 21번라인 지우기

 

5) 브리지헤더 연결

Objective-C Bridging Header에 "KakaoOpenSDK-Bridging-Hedaer.h"입력

4. 로그인 & 로그아웃 & 유저정보

1) 초기화

    // SceneDelegate.swift
    // import KakaoOpenSDK
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        guard let url = URLContexts.first?.url else {return}
        KOSession.handleOpen(url)
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        KOSession.handleDidBecomeActive()
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        KOSession.handleDidEnterBackground()
    }

2) 로그인

import UIKit

class LoginViewController: UIViewController {
    
    @IBOutlet var loginButton: KOLoginButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func login(_ sender: Any) {
        
        guard let session = KOSession.shared() else {
            return
        }

        if session.isOpen() {
            session.close()
        }
        
        session.open(completionHandler: { (error) -> Void in
            
            if !session.isOpen() {
                if let error = error as NSError? {
                    switch error.code {
                    case Int(KOErrorCancelled.rawValue):
                        break
                    default:
                        print("오류")
                    }
                }
            } else {
                let mvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainViewController")
                self.present(mvc, animated: true)
            }
        })
    }
}

3) 로그아웃

// MainViewController.swift
@IBAction func logout(_ sender: Any) {
    guard let session = KOSession.shared() else { return }
    session.logoutAndClose { (success, error) in
        if success {
            print("logout success.")
            self.dismiss(animated: true, completion: nil)
        } else {
            print(error?.localizedDescription)
        }
    }
    
    let lvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController")
    present(lvc, animated: true)
}

4) 유저정보

// MainViewController.swift
// 유저정보 request & response
private func setInfo() {
  KOSessionTask.userMeTask{(error, user) in
      guard let user = user,
          let email = user.account?.email,
          let name = user.account?.profile?.nickname,
          let id = user.id else {return}

      self.nicknameLabel.text = name
      self.emailLabel.text = email
      self.id.text = id

  }
}

5.Token관리

1) 토큰 암호화 저장

info.plist추가 (디폴트는 false)

<key>KAKAO_SECURE_MODE</key>
<true/>

2) 사용자 토큰 주기적 갱신

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        KOSession.shared()?.isAutomaticPeriodicRefresh = true
        return true
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        KOSession.handleDidEnterBackground()
    }

3) 토큰확인하여 자동로그인 : KOSession.shared()?.isOpen() 사용

// SceneDelegate.swift
	func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        window = UIWindow(windowScene: windowScene)
        
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        
        loginVC = storyboard.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
        mainVC = storyboard.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController
        
        guard let isOpened = KOSession.shared()?.isOpen() else {
             return
        }
        if isOpened {
            window?.rootViewController = mainVC
        } else {
            window?.rootViewController = loginVC
        }
        
        window?.makeKeyAndVisible()
    }

 

* 참고

developer-fury.tistory.com/19

developers.kakao.com/docs/latest/ko/kakaologin/ios

 

 

'OAuth Login' 카테고리의 다른 글

[iOS - Login] 애플로 로그인  (1) 2020.07.08
[iOS - Login] 구글로 로그인  (0) 2020.07.07
[iOS - Login] 네이버로 로그인  (0) 2020.07.03
Comments