SwiftUI - Naver Login
지난 구글, 카카오 로그인 에 이어서 Naver API 를 이용한 로그인 (네아로) 를 진행 하고자 합니다.
SwiftUI 방식으로 진행 했습니다. 운영하면서 다른내용이 나온다면 추가 하겠습니다.
1. 설치
pod 'naveridlogin-sdk-ios'
2. 셋팅
네이버 회원가입, 어플리케이션 추가는 완료 했다는 가정하에 진행입니다.
info.plist 파일에 다음과 같이 스키마를 추가 해줍니다.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>naversearchapp</string>
<string>naversearchthirdlogin</string>
</array>
*iOS 14 부터 LSApplicationQueriesSchemes 키값이 Queried URL Schemes 으로 바뀌었습니다 (상단 이미지 참고)
Source Code 방식으로 수정할경우 LSApplicationQueriesSchemes 키 값으로 추가 합니다. (Property List 방식으로 추가 했습니다)
아래 이미지 연동 규격서에 알맞게 해당 파일을 직접 수정해주는 작업을 해야합니다.
SDK 가 objective-c 으로 만들어져 있으며 해당 헤더파일을 열어서 수정 해줍니다.
Pods -> naveridlogin-sdk-ios -> frameworks -> NaverThirdPartyLogin -> Show In Finder
해당 파일 Headers 에 있는 NaverThirdPartyConstantsForApp 파일을 열어줍니다.
해당 파일에있는 kServiceAppUrlScheme, kConsumerKey, kConsumerSecret 값을 바꿔줍니다
kServiceAppUrlScheme: URL 스키마 값
kConsumerKey: Naver Developers 내 어플리케이션에있는 Client ID
kConsumerSecret: Naver Developers 내 어플리케이션에 있는 Client Secret
설정후 실행시에 다음과 같은 오류가 발생할수 있습니다.
project -> Build Settings -> User Script Sandboxing 값 No 로 변경
3. 소스 추가
필자는 SwiftUI 로 정말 간단하게, 일회성으로 실행이 가능하도록만 구현했습니다.
추가적으로 필요한 사항은 지속적으로 업데이트 하겠습니다.
Appdelegate, SceneDelegate 상에 다음 코드를 추가 합니다. 필자는 SwiftUI @main 에서 처리 했습니다.
import SwiftUI
import NaverThirdPartyLogin
@main
struct TestApp: App {
init() {
let instance = NaverThirdPartyLoginConnection.getSharedInstance()
instance?.isNaverAppOauthEnable = true // 네이버 앱으로 인증
// instance?.isInAppOauthEnable = true // Safari 웹으로 인증
instance?.isOnlyPortraitSupportedInIphone()
instance?.serviceUrlScheme = "" // URL 스키마 값
instance?.consumerKey = "" // Naver Developers 내 어플리케이션에있는 Client ID
instance?.consumerSecret = "" // Naver Developers 내 어플리케이션에 있는 Client Secret
instance?.appName = "" // 앱 이름
}
var body: some Scene {
WindowGroup {
ContentView().onOpenURL(perform: { url in
NaverThirdPartyLoginConnection
.getSharedInstance()
.receiveAccessToken(url)
})
}
}
}
호출 영역 (버튼 클릭시)
카카오와 다른 로그인 API 와 다르게, 네이버 같은경우 결과 값이 NaverThirdPartyLoginConnectionDelegate 상에서 들어오기에 해당
UIViewControllerRepresentable 를 이용하여 처리 해줍니다.
@State var isNaverLogin: Bool = false
var body: some View {
ZStack {
if isNaverLogin {
NaverLoginRepresentable()
}
VStack(spacing: 0) {
Text("네이버로 시작하기")
.foregroundColor(Color.white)
.font(Font.system(size: 16, weight: .bold, design: .default))
.padding(.vertical, 16)
.onTapGesture {
isNaverLogin = true
}
}
}
}
결과값 수신 (API 통신 로직 생략)
import Foundation
import UIKit
import NaverThirdPartyLogin
import SwiftUI
struct NaverLoginRepresentable: UIViewControllerRepresentable {
func makeUIViewController(context: UIViewControllerRepresentableContext<NaverLoginRepresentable>) -> NaverLoginViewController {
let naverLoginViewController = NaverLoginViewController()
return naverLoginViewController
}
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }
}
class NaverLoginViewController: UIViewController {
let naverLoginInstance = NaverThirdPartyLoginConnection.getSharedInstance()
override func viewDidLoad() {
super.viewDidLoad()
self.naverLoginInstance?.delegate = self
self.naverLoginInstance?.requestThirdPartyLogin()
}
}
extension NaverLoginViewController: NaverThirdPartyLoginConnectionDelegate {
// 로그인 성공시 메소드 (추가적인 API 통신을 진행하여 정보를 가져옴)
func oauth20ConnectionDidFinishRequestACTokenWithAuthCode() {
print("Success login")
}
// 토큰을 재 갱신하는경우 메소드
func oauth20ConnectionDidFinishRequestACTokenWithRefreshToken() {
print("Success RefreshToken")
}
// 로그아웃 (토큰 삭제) 완료시 메소드
func oauth20ConnectionDidFinishDeleteToken() {
print("Success logout")
naverLoginInstance?.requestDeleteToken()
}
// 모든 에러관련한 메소드
func oauth20Connection(_ oauthConnection: NaverThirdPartyLoginConnection!, didFailWithError error: Error!) {
print("error = \(error.localizedDescription)")
naverLoginInstance?.requestDeleteToken()
}
}
해당 함수 같은경우 네이버 앱을 통해 인증을 완료했을때 반응 합니다.
토큰, 기타 사용자 정보를 가져오기 위해서는 API 통신을 이용하여 데이터를 가져올수 있습니다.
func oauth20ConnectionDidFinishRequestACTokenWithAuthCode() {
print("Success login")
}
해당 정보를 가져오는 API 는 다음 규격으로 호출하여 가져올수 있습니다.
func getNaverUserInfo() {
guard let isValidAccessToken = naverLoginInstance?.isValidAccessTokenExpireTimeNow() else { return }
if !isValidAccessToken {
return
}
guard let tokenType = naverLoginInstance?.tokenType else { return }
guard let accessToken = naverLoginInstance?.accessToken else { return }
guard let refreshToken = naverLoginInstance?.refreshToken else { return }
let urlStr = "https://openapi.naver.com/v1/nid/me"
let url = URL(string: urlStr)!
let request = AF.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: ["Authorization": "\(tokenType) \(accessToken)"])
request.responseJSON { response in
guard let result = response.value as? [String: Any] else { return }
guard let object = result["response"] as? [String: Any] else { return }
guard let name = object["name"] as? String else { return }
guard let email = object["email"] as? String else { return }
guard let id = object["id"] as? String else {return}
}
}
참고
https://doggyfootstep.tistory.com/22
[iOS] 네이버 로그인 SDK 연동하기
안녕하세요 🐾 카카오톡 로그인에 이어 네이버 로그인 SDK 연동 과정도 정리하려 글을 남깁니다. 네이버 로그인 SDK는 object-c로 되어있어 익숙하지 않아 그런지 카카오톡 로그인보다 좀 더 많이
doggyfootstep.tistory.com
https://developers.naver.com/docs/login/ios/ios.md
IOS - LOGIN
iOS용 네이버 로그인 라이브러리는 Objective-C로 만들어졌으며, 서드파티 애플리케이션에서 네이버 로그인이 제공하는 로그인, 로그아웃, 토큰 관리 등의 기능을 쉽게 구현할 수 있게 합니다. 1. 요
developers.naver.com
https://developer-fury.tistory.com/18
[Swift] Naver 로그인 API 사용하기(네아로 사용하기)
NAVER 로그인 API 사용하기 Record 작성일 2019. 10. 11 (금) 2020. 06. 23(화) Swift 버전 Swift 5 Swift 5.1 Xcode 버전 11.1 11.5 안녕하세요 :] 학원의 프로젝트도 끝나고 해서 오랜만에 블로그를 다시 시작하려고 해
developer-fury.tistory.com