Language/iOS,AOS

네이버 간편 로그인 연동

건담아빠 2023. 2. 21. 19:00

 

1. 네이버 개발자 사이트 앱 등록 (스킵)

네이버 개발자 사이트 접속 후 앱 등록

https://developers.naver.com/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

 

앱 등록

다운로드 URL은 배포전이라면 회사 홈페이지 주소를 링크해 둬도 되고, URL Scheme은 소문자로 구성하는것을 권장한다. (대문자일경우 사파리에서 인증이 잘 안되는 이슈가 있음)

XCode 설정시에 URL Scheme 설정을 해주는 부분이 있으니 기억해 두도록 하자.

 

2. SDK 설치

코코아팟으로 SDK 설치합니다.

참조 : https://dchkang83.tistory.com/104

 

iOS/Xcode 14X - 2. CocoaPods 추가

CocoaPods란? dependacy management & 많은 xcode 프로젝트 라이브러리 들을 관리한다. (gradle?, maven? 등의 역할!!) Xcode에서 라이브러리 관리(Dependency Management)해주는 방법에는 대표적으로 3가지가 있다 CocoaPod

dchkang83.tistory.com

 

네이버 개발자 문서를 보면 아래와 같이 친절히 설명되어 있습니다.

참조 : https://developers.naver.com/docs/login/sdks/sdks.md

target 'gobang' do
  ...
  # 네이버
  pod 'naveridlogin-sdk-ios'
  ...
end

SDK 설치가 완료되었다면 Xcode를 재시작 해주시고 라이브러리가 인식할 수 있도록 해줍니다.

 

3. Xcode 설정

3.1. 앱 실행 허용 목록 설정하기

iOS 9.0 이상에서 iOS SDK를 통해 네이버 등 애플리케이션을 실행시키는 기능을 이용하려면 info.plish 파일에 앱 실행 허용 목록을 설정해야 한다고 합니다.

 

Info -> Open As -> Source Code

 

info.plist 에 LSApplicationQueriesSchemes를 추가하고 해당 키의 item으로 naversearchapp, naversearchthirdlogin 추가

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ...
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>kakaokompassauth</string>
        <string>kakaolink</string>
        <string>naversearchapp</string>
        <string>naversearchthirdlogin</string>
    </array>
    ...
</dict>
</plist>

 

3.2. URL Schemes 설정하기

네이버계정을 통한 인증과 네이버를 통한 앱 실행을 위해 URL Schemes 설정을 해줘야 합니다.

TARGETS -> Info -> URL Types 에서 `+`를 눌러 추가해 주고 URL Schemes 항목에는 naver 개발자 사이트에서 입력한 URL Schemes(naverlogin)를 입력해주고 identifier 항목도 채워주도록 한다.

 

4. 코코아팟 - 환경 구성

https://developers.naver.com/docs/login/ios/ios.md 사이트에 따르면 NaverThirdPartyConstantsForApp.h의 상수를 수정해 줘야 한다고 하는데.. 이렇게 하면 실제 실무에서 사용하기 힘들듯하다.

필자 같은 경우에는 AppDelegate에서 설정을 해줘도 되지만 다른방식으로 설정을 진행하였다. (4.5. 참조!!)

4.1. ~ 4.4. 까지는 하나의 방식일뿐 필자는 사용하지 않는다!

4.1. NaverThirdPartyLogin에서 Finder 열기

Pods -> naverilogin-sdk-ios -> NaverThirdPartyLogin -> Show In Finder

Pods -> naverilogin-sdk-ios -> NaverThirdPartyLogin -> Show In Finder

 

4.2. NaverThirdPartyConstantsForApp.h 설정 변경

 

4.3. 상수 수정

 

4.4. AppDelegate 환경 설정

import NaverThirdPartyLogin

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        ...
        let instance = NaverThirdPartyLoginConnection.getSharedInstance()
        
        // 네이버 앱으로 인증 방식 활성화
        instance?.isNaverAppOauthEnable = true
        
        // SafariViewController로 인증 방식 활성화
        instance?.isInAppOauthEnable = true
        
         // 아이폰에서 인증 화면을 세로모드에서만 적용
        instance?.isOnlyPortraitSupportedInIphone()
        
        instance?.serviceUrlScheme = {Scheme}
        instance?.consumerKey = {Client ID}
        instance?.consumerSecret = {Client Secret}
        instance?.appName = {앱 이름}
        
        return true
    }
    ...
}

 

4.5. 앱의 진입 형태에 따라서 설정

앱 진입부 InitViewController를 설정하고 로컬,개발,스테이징,운영 선택지에 따라서 설정하도록 하였다.

https://dchkang83.tistory.com/124

 

iOS/WebView/Project - 서버별 테스트 환경 만들기#11

IOS/Xcode 14X Swift5.7.2 WKWebView 에서 작업 진행 이번장에서는 지난 블로그에서 설정한 Constants(상수) 및 AppInfo(싱글톤)를 활용하여 웹뷰에 나타나는 웹서버를 변경할 수 있도록하여 디버깅 및 앱에 대

dchkang83.tistory.com

 

`로컬,개발,스테이징,운영` 버튼을 선택할때 아래 코드를 통해서 인증에 대한 초기화를 해주었다.

let instance = NaverThirdPartyLoginConnection.getSharedInstance()

// 네이버 앱으로 인증 방식 활성화
instance?.isNaverAppOauthEnable = true

// SafariViewController로 인증 방식 활성화
instance?.isInAppOauthEnable = true

 // 아이폰에서 인증 화면을 세로모드에서만 적용
instance?.isOnlyPortraitSupportedInIphone()

instance?.serviceUrlScheme = {로컬 Scheme}
instance?.consumerKey = {로컬 Client ID}
instance?.consumerSecret = {로컬 Client Secret}
instance?.appName = {로컬 앱 이름}

 

그밖에도 User-Defined에 운영환경에 따른 변수를 추가하고 (https://dchkang83.tistory.com/154)

https://leechanho.tistory.com/48 블로그의 내용처럼 추가해서 사용도 가능하다.

 

5. SceneDelegate 설정

네이버는 AppDelegate에서 해주는것 같은나.. 카카오처럼 SceneDelegate에서 해도 괜찮은듯해서 옮겨서 사용하고 있다!

import NaverThirdPartyLogin

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    ....
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        // 네이버 로그인 화면이 새로 등장 -> 토큰을 요청하는 코드
        let result = NaverThirdPartyLoginConnection.getSharedInstance().receiveAccessToken(URLContexts.first?.url)
        if result == CANCELBYUSER {
            Utils.Log("result : \(result)")
        }
    }
    ...
}

 

6. 로그인,  로그아웃, 리플래시,  유저 정보 확인 및 가져오기

6.1. 로그인

naverLoginInstance?.delegate = self 이부분때문에 좀 헤멧다.. self를 넣어주지 않으면 NaverThirdPartyLoginConnectionDelegate 상속을 통해 선언함 함수부가 타지 않는것으로 확인되어 self를 넣어주었다.

뭔가 잘못했겟지! 하지만 시간 없으니 일단 요렇게만 넣고 패스하자!

let naverLoginInstance = NaverThirdPartyLoginConnection.getSharedInstance()

// 반드시 self 해줘야함.. 안그럼 delegate 못타는듯??
naverLoginInstance?.delegate = self
let accessToken = naverLoginInstance?.accessToken

 

6.2. 로그아웃

NaverThirdPartyLoginConnection.getSharedInstance()?.resetToken()

 

6.3. 연동해제

NaverThirdPartyLoginConnection.getSharedInstance()?.requestDeleteToken()

 

6.4. 이벤트 등

extension MainViewController: NaverThirdPartyLoginConnectionDelegate {
    ...
    func oauth20ConnectionDidFinishRequestACTokenWithAuthCode() {
        // 로그인 성공 (로그인된 상태에서 requestThirdPartyLogin()를 호출하면 이 메서드는 불리지 않는다.)
        print("로그인 성공!!")
        
    }
    
    func oauth20ConnectionDidFinishRequestACTokenWithRefreshToken() {
        // 로그인된 상태(로그아웃이나 연동해제 하지않은 상태)에서 로그인 재시도
        print("리프레시 토큰")
    }
    
    func oauth20ConnectionDidFinishDeleteToken() {
        // 연동해제 콜백
        print("로그아웃")
//        getInfo()
    }
    
    func oauth20Connection(_ oauthConnection: NaverThirdPartyLoginConnection!, didFailWithError error: Error!) {
        //  접근 토큰, 갱신 토큰, 연동 해제등이 실패
        print("---ERROR: \(error.localizedDescription)---")
    }
    ...
}

 

성공!! 짝짝짝!

 

간단히만 처리해 두고 실제 적용할때 리팩토링좀 해야겠다.

 

 

참조

https://www.zehye.kr/blog/page14/

 

Blog · 지혜의 개발공부로그

12 Oct 2021 | iOS 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다. OS_ACTIVITY_MODE Xcode 버전업을 하고나서부터 불필요한 로그들이 콘솔창에 찍히게 되었다. 이는 Xcode8

www.zehye.kr

https://docfriends.github.io/DevStrory/2018-12-18/swift-sns-login/#4naver

 

닥프렌즈

닥프렌즈의 기술 블로그

docfriends.github.io

https://velog.io/@yc1303/ios%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%95%84%EC%9D%B4%EB%94%94%EB%A1%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84

 

[ios]네이버 아이디로 로그인 구현

NAVER Login Pod Install Naver ID Login SDK for iOS 나중에 회원 정보를 가져와야 하므로 Alamofire도 설치하자 UI구현 로그인 버튼과 로그아웃 버튼, 로그인이 완료됐을 때 보여질 이름, 이메일, 아이디(id) 라벨

velog.io