Flutter web 에서 flutter kakao sdk 를 이용한 로그인 구현

flutter 로 하이브리드 앱을 구현하고있습니다.

먼저 앱키는:852196 입니다

flutter kakao sdk 를 이용한 카카오 로그인 방식이 두가지라는 걸 이해하고있습니다.

  1. 기본방식
  2. redirect 방식

저는 android 환경에서 1번의 기본방식으로 카카오 로그인을 성공했습니다.

 ElevatedButton(
              onPressed: () async {
                print(await isKakaoTalkInstalled());
                if (await isKakaoTalkInstalled() == true) {
                  try {
                    OAuthToken token =
                        await UserApi.instance.loginWithKakaoTalk();
                    print('카카오톡으로 로그인 성공 ${token.accessToken}');
                  } catch (error) {
                    print('카카오톡으로 로그인 실패 $error');
                  }
                } else {
                  try {
                    OAuthToken token =
                        await UserApi.instance.loginWithKakaoAccount();
                    print('카카오계정으로 로그인 성공 ${token.accessToken}');
                  } catch (error) {
                    print('카카오계정으로 로그인 실패 $error');
                  }
                }
              },
              child: Text('카카오톡으로 로그인'),
            ),

해당 코드는 kakao 디벨로퍼 공홈에 있는 flutter sdk 샘플 코드를 그대로 이용했습니다.

이렇게 했을때 안드로이드 환경에선 로그인이 완료되어 토큰 발급을 성공하였는데

flutter web 환경에선 아이디 비번 치고 2차 인증하고 동의화면 까지는 나오는데

동의 화면 후 관리자 설정이슈 (KOE006) 이 뜹니다.

이 오류가 web 환경에서 redirect url 을 입력하지 않아 생기는 오류라고 해서

web 플랫폼을 http://localhost/ 로 등록하였고,

카카오로그인 설정에서 redirect url 또한 http://localhost/http://localhost/oauth 로 설정하였습니다.

하지만 여전히 K0E006 이슈가 뜹니다.

flutter main 에 정상적으로 sdk init 도 시켜주었고

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  setPathUrlStrategy(); //url 에 # 삭제
  KakaoSdk.init(
    nativeAppKey: '보안상 가립니다',
    javaScriptAppKey: '보안상 가립니다',
  );
  runApp(const MyApp());
}

AndroidMainfest 쪽에도

<activity
           android:name="com.kakao.sdk.flutter.AuthCodeCustomTabsActivity"
           android:exported="true">
           <intent-filter android:label="flutter_web_auth">
               <action android:name="android.intent.action.VIEW" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.BROWSABLE" />

               <!-- Redirect URI, "kakao${YOUR_NATIVE_APP_KEY}://oauth" 형식 -->
               <data android:scheme="보안상 가립니다" android:host="oauth"/>
           </intent-filter>
       </activity>

해당 설정을 해주었습니다.

flutter web에서 redirect 방식이 아닌 기본 방식으로 flutter kakao sdk 를 이용해서 로그인을 구현할 시 더 설정해야하는 부분이 있을까요?

K0E006 이 뜨는 문제는 해결했습니다.
redirect url 을 http://localhost/http://localhost/oauth 로 지정한거에서
http://localhost/ 로만 지정했는데 해결되었습니다.
지금 로그인이 완료되면 http://localhost/?code=“문자열”
이렇게 이동되고있는데 문자열 부분이 발급받은 토큰이 맞을까요?

맞다면 새로운 문제가 생겼는데 로그인이 완료되면 카카오로그인 때문에 열린 새창에서 http://localhost/?code=“문자열” 여길로갔다가 창이 닫힙니다. 토큰을 어떻게 활용할 수 있나요?

안녕하세요.

전달된 code는 인가코드 입니다.
인가코드로 접근토큰을 발급 받을수 있습니다.

카카오 로그인은 1) 인가코드 발급 → 2) 접근토큰 발급 순으로 처리되어야 합니다.

사용자가 카카오 로그인 시, 사용자 동의 과정을 마치면 파라미터 redirect_uri 로 전달된 서비스측 주소로 인가코드(code)를 포함 302 리디렉션 합니다.
이후 인가코드로 접근토큰을 발급 받으시고 필요한 서비스측 인가(세션) 처리를 진행하시면 됩니다.

카카오 flutter 문서에 보면

loginWithKakaoAccount()가 호출되면 Flutter SDK가 기본 브라우저를 사용해 카카오계정 로그인 페이지를 엽니다. 해당 페이지에서 사용자가 ID와 비밀번호를 입력해 카카오계정으로 로그인하면 앱 이용 관련 동의를 구하는 동의 화면이 출력됩니다. 동의 화면에서 사용자가 모든 필수 항목에 동의하고 [동의하고 계속하기]를 선택하면 인가 코드가 발급되고, Flutter SDK가 인가 코드로 토큰을 발급받아 로그인을 완료합니다. OpenID Connect를 사용하는 앱인 경우, ID 토큰을 함께 발급받습니다. 발급된 토큰은 Flutter SDK가 TokenManager를 통해 내부적으로 관리하며, 로그인이 필요한 카카오 API 호출 시 사용합니다.

사용자가 동의 화면에서 로그인을 취소하거나, 다른 에러가 발생한 경우에는 레퍼런스를 참고하여 각각 예외 처리합니다. 카카오 로그인 구현 예제를 참고합니다

여기 인가코드를 발급받으면 flutter sdk 가 알아서 인가코드로 토큰을 발급받는 다고 써있습니다.
이거와 별개로 web 은 항상 인가코드만 발급되는 redirect 방식을 사용한다는 말씀이실까용?

안녕하세요

‘기본 방식’ 이라고 말씀하고 계신 방식이 플러터 웹에서 별도로 팝업을 띄워서 로그인을 진행하는 팝업 방식에 대한 얘기 것 같아서 팝업 방식에 대해서 설명드리겠습니다.

우선 팝업 방식을 사용하시려면 UserApi.instance.loginWithKakaoTalk() 또는 UserApi.instance.loginWithKakaoAccount() 를 사용하는 것이 맞습니다. 그리고 팝업 방식 로그인을 사용하기 위해서는 말씀하신대로 redirect url 등록이 필요한데요, redirect url은 팝업 로그인을 실행하는 페이지의 url 을 등록하시면 됩니다.
ex 로그인 페이지가 http://localhost 라면 http://localhost 등록, 로그인 페이지가 http://localhost/oauth 라면 http://localhost/oauth 를 등록

추가로 말씀주신 내용 중에 궁금한 점이 있는데요, 위에 말씀하신 내용이 로그인이 정상적으로 된 경우를 의미하는지 code만 발급되고 토큰 발급은 안된 경우인지 궁금합니다. 만약 code만 발급되고 토큰이 발급되지 않은 경우라면 앱 id 첨부해주시면 확인해보겠습니다

1개의 좋아요

로그인이 완료되면 토큰 값이 프린트 되게 하였는데 프린트가 안되는걸 보니
인가코드는 발급되었는데 토큰 발급에서 문제가 생기는것같습니다.
앱 아이디는 852196 입니다 감사합니다.

서버 로그를 확인해봤을 때는 정상적으로 토큰 발급까지 완료가 되었네요

처음 질문주신 내용 중에 하이브리드 앱을 개발 중이라고 하신 것을 보면 웹 뷰 환경에서 웹 페이지를 띄운 형태일 수 있을 것 같은데요, 혹시 웹 뷰를 사용하시는게 맞다면 팝업 설정이 허용되어있는지 확인 부탁드리고 팝업 허용 설정이 안되어있다면 설정 후 다시 확인 부탁드립니다.

현재 문제가 생긴부분은 chrome 으로 열었을때 발생하는 문제입니다.
flutter web 문제입니다 :sleepy:

chrome 으로 flutter web 실행시
카카오로그인을 진행하면 새탭이 하나 생기고
로그인이 완료되면 잠시 localhost?code=인가코드? 로 redirect 되고 탭이 꺼지고 아무일도 안일어나는 상태입니다.
로그인이 정상적으로 완료되었다면 토큰값이 print 되게 해놨습니다. 코드는 카카오톡 공식 문서 예제 그대로 사용하였습니다.

서버 로그를 확인해봐도 문제가 없어보이고 이슈가 재현도 되지 않아서 정확히 파악이 잘 안되고 있네요ㅠㅠ

한가지 특이사항으로는 일반적으로 플러터 웹으로 빌드했을 때와는 다르게 80 포트로 지정된 것으로 보이는데요, 혹시 다른 포트로 지정하거나 별도의 도메인에 올렸을 때도 동일한 이슈가 발생하는지 확인부탁드리겠습니다. (다른 포트를 지정하거나 도메인을 올리게 되면 redirect url 등록이 필요합니다)

다시 해보니 정상작동됩니다 감사합니다:)

1개의 좋아요