본문 바로가기

일::개발

Flutter: Firebase, 웹 서비스 없이 네이버 로그인: Flutter Naver Sign in without Firebase and Web Service

Firebase 를 사용하지 않는 프로젝트에서 네이버 아이디로 로그인하기를 구현해보자.

이전에 해봤던 방식은 flutter_web_auth 패키지를 이용해서 별도로 만든 웹서비스를 콜백으로 지정하여 네이버에 인증 요청을 하는 것이었다.

  final url = Uri.https('nid.naver.com', '/oauth2.0/authorize', {
    'client_id': Constants.naver_client_id,
    'redirect_uri':
        'https://[CUSTOM_WEB_SERVICE]/callbacks/naver/sign_in',
    'response_type': 'code',
    'state': clientState,
  });

  final result = await FlutterWebAuth.authenticate(
      url: url.toString(), callbackUrlScheme: 'webauthcallback');

이 경우에는 1) 별도의 웹서비스를 유지해야 한다. 2) 네이버에서 제공하는 Android, iOS SDK를 이용하지 않기 때문에 네이버 앱으로 로그인 되지 않고 브라우저를 이용하게 된다. 

 

그래서 이번에는 네이버 SDK를 사용해서 잘 만들어놓은 flutter_naver_login 패키지를 이용해본다.

 

제일 먼저 해야 할 일은 네이버 개발자 사이트에서 application을 만들고 필요한 설정을 마치는 것이다.

 

 

애플리케이션을 등록하면 Client ID와 Client Secret 을 얻을 수 있다.

API 설정 탭에서는 애플리케이션 이름과 안드로이드, iOS 앱 정보를 설정해준다.

애플리케이션 이름은 네이버로그인 진행 중에 사용자에게 보이는 이름이고, API 호출할 때도 필요하다...........

안드로이드 앱 정보는 다운로드 URL과 앱 패키지명만 입력하면 되니 간단하고, iOS의 경우에는 URL Scheme 에 번들 ID를 넣어주면 된다. (꼭 번들 ID일 필요는 없는 것 같지만, 번들ID를 넣으면 잘 동작한다.)

 

1. 안드로이드

안드로이드 설정은 사실 flutter_naver_login 패키지 설명대로만 하면 큰 문제 없이 잘 된다.

 

1) android/app/src/main/res/values/strings.xml 에 client_id, client_secret, client_name 정의하기

네이버 개발자 사이트의 애플리케이션 정보에서 얻은 값들을 넣어준다.

 

2) android/app/src/main/AndroidManifest.xml 에 meta-data 추가

@string/client_id, @string/client_secret, @string/client_name 을 application metadata에 추가한다.

(<application> tag 하위에 넣어야 한다. <activity> tag 하위에 넣으면 제대로 동작하지 않는다.)

  <application
        android:label="AppLabel"
        android:icon="@mipmap/ic_launcher">

        <meta-data
            android:name="com.naver.sdk.clientId"
            android:value="@string/client_id" />
        <meta-data
            android:name="com.naver.sdk.clientSecret"
            android:value="@string/client_secret" />
        <meta-data
            android:name="com.naver.sdk.clientName"
            android:value="@string/client_name" />

3) API 호출

      MaterialButton(
        onPressed: () async {

            try {
              final NaverLoginResult res = await FlutterNaverLogin.logIn();
              final NaverAccessToken accessToken = await FlutterNaverLogin.currentAccessToken;

// res.account.email, res.account.id, res.account.nickname 사용 가능. 네이버 email은 인증된 이메일
// accessToken.accessToken, accessToken.expiresAt, accessToken.refreshToken, accessToken.tokenType

              if (accessToken.accessToken.isEmpty) {
                // 네이버 인증 실패
              } else {
              	// 네이버 인증 성공
              }
            } catch (e) {
              // 인증 과정에서 오류
            }
          }
        },
        child: Image.asset('assets/icons/icon_login_naver.png', width: 60),
      ),

간단하게 FlutterNaverLogin.logIn() 을 호출해주면 네이버 인증을 거친 후 요청한 사용자 정보와 accessToken, refreshToken을 얻을 수 있다.

 

이후에 네이버 아이디로 로그인을 사용하는 서비스에 account id와 access token을 가지고 로그인 요청하면 서비스에서 account id, access token을 이용해서 네이버에 정당한 사용자임을 확인할 수 있다.

 

2. iOS

1) Info.plist

iOS의 경우에는 먼저 Info.plist 에 필요한 정보를 입력해준다.

flutter_naver_info 패키지에 설명된 대로 하면 되는데, [UrlScheme] 로 표현된 부분에는 app bundle id, [ConsumerKey] 는 네이버 개발자 페이지에서 받아온 client_id, [ConsumerSecret]는 client_secret, [ServiceAppName]은 client_name 을 넣어주면 된다.

 

NSAppTransportSecurity 항목을 잘 넣어줘야 한다.

Info.plist 페이지를 텍스트로 직접 수정했다면 xcode에서 제대로 되었는지 확인해보면 좋다.

naver.com, naver.net 이 정상적으로 포함되어 있어야 한다.

2) AppDelegate.swift

AppDelegate.swift 파일이나 AppDelegate.m 파일을 수정해줘야 하는데, flutter 앱 만들 때 설정한 언어의 파일을 수정해주면 된다. 아마 기본은 swift일 것이다.

 

여기서 flutter_naver_login 패키지의 설명대로 하면 문제가 생기는데, 얼핏 봐서는 다른 문제로 보이는 에러가 발생한다.

flutter build ios --verbose 로 확인해보면 문제를 쉽게 찾을 수 있다.

 

error:
'UIApplicationOpenURLOptionsKey' has
                        been renamed to 'UIApplication.OpenURLOptionsKey'

 

import NaverThirdPartyLogin

override func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options)
}

UIApplicationOpenURLOption 을 아래와 같이 UIApplication.OpenURLOption 으로 바꿔주기만 하면 된다.

import NaverThirdPartyLogin

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

 

혹시 빌드가 안 된다면 flutter clean, ios/Pods 삭제, flutter pub get, pod install 해보자.