[Flutter] Kakao Login 동의창 미노출 오류

💛DabongLog·2022년 7월 14일
0

📌이슈 해결

목록 보기
3/5
post-thumbnail

카카오 로그인을 구현하고 잘 되는지 테스트까지 마친 후였는데 ..!! 어느 날 보니 갑자기 기능이 작동하지 않았다...

앱 미설치 시 링크(AuthCodeClient.instance.request())를 통해 로그인하는 로직은 잘 동작하는데 문제는 앱을 통한 로그인 기능(AuthCodeClient.instance.requestWithTalk())이 말썽이었다.

정상적이라면 동의창이 뜨고 동의하면 다시 개발 중인 앱으로 돌아가야 하는데, 카톡으로 이동한 후 동의화면도 뜨지 않은 채 바로 개발중인 앱으로 돌아오는 것이었다..

kakao developer 문의 결과 서버 로그에는 내쪽으로 토큰이 잘 발급되고 있다는 피드백을 받았다.

..? 대체 왜 안 되는데 그럼 .. 🤯


원인

원인은 네이버 로그인을 추가하면서 카카오톡 로그인에 사용되는 url이 네이버 SDK에서 수신받아 처리되고 있는 것이었다.

import UIKit
import Flutter
import NaverThirdPartyLogin

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {

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

  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

네이버 로그인을 위해선 위와 같이 AppDelegate.swift에 NaverThirdPartyLoginConnection 관련 함수를 추가해야 한다.

카카오에서 받아오는 인증코드는 다음과 같은 딥링크 형태이다.

kakao{NATIVE_APP_KEY}://oauth?code=인증코드

해결

url이 카카오 로그인을 위한 건지 네이버 로그인을 위한 건지를 구분하면 해결된다. (딥링크에 kakao가 포함됐는지 체크)

import UIKit
import Flutter
import NaverThirdPartyLogin

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {

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

     if url.absoluteString.hasPrefix("kakao") {
         result = super.application(app, open: url, options: options)
     }

     if !result {
         result = NaverThirdPartyLoginConnection.getSharedInstance()?.application(app, open: url, options: options)
     }
     return result
  }

  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
profile
모바일 어플리케이션 개발자 (Flutter, iOS, Android)

0개의 댓글