iOS/UIKit

[Swift/iOS] 네.아.로 네이버 로그인 구현하기

최지철 2023. 2. 26. 22:49
728x90
반응형

https://developers.naver.com/main/

 

NAVER Developers

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

developers.naver.com

네이버 로그인 API를 생성한다. 이부분은 생략하고 코드부분만 설명하겠습니당!

!Alamofire가 있다는 전제하에, 설명합니당!

우선 API 생성하실 때, URL Scheme 을 복사 한 뒤,

프로젝트 info에서 URL Types에 추가 해줍니당!

 

pod 'naveridlogin-sdk-ios'

 

pod 을 추가해주십니다!

https://developers.naver.com/docs/login/devguide/devguide.md#네이버%20로그인-개발가이드

(네이버 로그인 개발가이드니 참고용으로 좋아용!)

 

네이버 로그인 개발가이드 - LOGIN

네이버 로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아이디

developers.naver.com

 

네이버 서드파티 폴더를 여신 뒤

서드파티 해당 헤더파일에 들어가시면

밑부분에

설정하신 UrlScheme, 클라이언트id, 시크릿클라이언트 id, 앱 이름(네이버 api사이트에서 설정하신것) 순으로 적어주시면 됩니다.

 

그런다음 AppDelegate로 가주신다음,   

 

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 = "" // Url설정하신 부븐

                instance?.consumerKey = ""//클라이언트

                instance?.consumerSecret = "" //시크릿클라이언트

                instance?.appName = "" //앱이름

        return true

    }

주석부분에 채워주세용 

 

그 다음 밑에 함수도 추가해주시면 됩니다.

 

 

  func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

        NaverThirdPartyLoginConnection.getSharedInstance()?.application(app, open: url, options: options)

        return true

 

그 다음 뷰컨트롤러로 가서

 

 let naverLoginInstance = NaverThirdPartyLoginConnection.getSharedInstance()

 

    override func viewDidLoad() {

        super.viewDidLoad()

        naverLoginInstance?.delegate = self

    }

델레게이트를 선언해줍니다.

 

아래 함수는 Json데이터를 갖고와 가공하는 함수입니다!

    func naverLoginPaser() {

              guard let accessToken = naverLoginInstance?.isValidAccessTokenExpireTimeNow() else { return }

              

              if !accessToken {

                return

              }

              

              guard let tokenType = naverLoginInstance?.tokenType else { return }

              guard let accessToken = naverLoginInstance?.accessToken else { return }

                

              let requestUrl = "https://openapi.naver.com/v1/nid/me"

              let url = URL(string: requestUrl)!

              

              let authorization = "\(tokenType) \(accessToken)"

        let req = AF.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: ["Authorization": authorization])

 

        req.response { response in

            guard let data = response.data else {

                // handle error

                return

            }

            do {

                let json = try JSONSerialization.jsonObject(with: data, options: [])

                if let body = json as? [String: Any], let resultCode = body["message"] as? String {

                    if resultCode.trimmingCharacters(in: .whitespaces) == "success" {

                        let resultJson = body["response"] as! [String: Any]

                        let name = resultJson["name"] as? String ?? ""

                        let id = resultJson["id"] as? String ?? ""

                        let phone = resultJson["mobile"] as! String

                        let gender = resultJson["gender"] as? String ?? ""

                        let birthyear = resultJson["birthyear"] as? String ?? ""

                        let birthday = resultJson["birthday"] as? String ?? ""

                        let profile = resultJson["profile_image"] as? String ?? ""

                        let email = resultJson["email"] as? String ?? ""

                        let nickName = resultJson["nickname"] as? String ?? ""

 

                        print("네이버 로그인 이름 ",name)

                        print("네이버 로그인 아이디 ",id)

                        print("네이버 로그인 핸드폰 ",phone)

                        print("네이버 로그인 성별 ",gender)

                        print("네이버 로그인 생년 ",birthyear)

                        print("네이버 로그인 생일 ",birthday)

                        print("네이버 로그인 프로필사진 ",profile)

                        print("네이버 로그인 이메일 ",email)

                        print("네이버 로그인 닉네임 ",nickName)

                        

                    } else {

                        // handle failure response

                    }

                }

            } catch {

                // handle error

            }

        }

        }

그 다음 익스텐션 하시거나, 바로 뷰컨트롤러에 서드파티 델레게이트 추가해주시면 됩니다!

 

extension ViewController: NaverThirdPartyLoginConnectionDelegate {

    func oauth20ConnectionDidFinishRequestACTokenWithAuthCode() {

        print("네이버 로그인 성공")

        self.naverLoginPaser()

 

    }

    

    func oauth20ConnectionDidFinishRequestACTokenWithRefreshToken() {

        print("네이버 토큰\(String(describing: naverLoginInstance?.accessToken))")

    }

    

    func oauth20ConnectionDidFinishDeleteToken() {

        print("네이버 로그아웃")

    }

    

    func oauth20Connection(_ oauthConnection: NaverThirdPartyLoginConnection!, didFailWithError error: Error!) {

        print("에러 = \(error.localizedDescription)")

 

    }

 

 

로그인, 로그아웃 이벤트에 이렇게 설정해주시면 잘 동작 될겁니다!

    @IBAction func NaverLoginBtn(_ sender: Any) {

        naverLoginInstance?.requestThirdPartyLogin() //로그인

    }

   @IBAction func NaverLogoutBtn(_ sender: Any) {

        naverLoginInstance?.requestDeleteToken() //로그아웃

    }

 

728x90
반응형