플러터 프로젝트에서 카카오 로그인 기능을 연동시키는 과정을 간단하게 기록한다. 참고한 링크는 다음과 같다.
https://vlee.kr/4986
1. 카카오 개발자 사이트에서 어플리케이션 등록하기
- 카카오 개발자 사이트 로그인
- 새 어플리케이션 등록하기
- 안드로이드 플랫폼 먼저 등록
- 키 해시 값 생성하기 위한 명령어 입력 -> 키 해시 생성됨.
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
- ios 플랫폼도 번들 ID는 android 패키지명과 같이 입력하여 등록하였음
2. Kakao Flutter SDK 설치
flutter pub add kakao_flutter_sdk
- 위 명령어 입력하여 sdk 설치함 => pubspec.yaml에 다음 버젼이 추가되었음
kakao_flutter_sdk: ^1.4.3
3. Android, iOS 디바이스에서 커스텀 URL 스킴 설정
아래 가이드에 잘 나와있음
https://developers.kakao.com/docs/latest/ko/getting-started/sdk-flutter#setup-scheme-android
- 수정하는 부분 형식의 예시 : kakao463290d289d5d792f9c9a9ad6d6f2c0b
- ios url scheme은 XCode로 들어가서 추가해주기 [아래 가이드 예시 참고]
https://developers.kakao.com/docs/latest/ko/getting-started/sdk-ios#set-up-url-schemes
4. 카카오 개발 가이드 참고해서 다음과 같은 과정을 거치는 로그인 알고리즘 구현
아래는 자체 제작한 model 폴더에 만든 kakao_login.dart파일
import 'package:kakao_flutter_sdk/kakao_flutter_sdk.dart';
import 'package:flutter/services.dart';
import 'package:logging/logging.dart';
final Logger _logger = Logger('Kakao Login');
void _getUserInfo() async {
try {
User user = await UserApi.instance.me();
_logger.info(
'사용자 정보 요청 성공: 회원번호: ${user.id}, 닉네임: ${user.kakaoAccount?.profile?.nickname}');
} catch (error) {
_logger.severe('사용자 정보 요청 실패: $error');
}
}
Future<void> signInWithKakao() async {
if (await AuthApi.instance.hasToken()) {
try {
AccessTokenInfo tokenInfo = await UserApi.instance.accessTokenInfo();
_logger.info('토큰 유효성 체크 성공: ${tokenInfo.id} ${tokenInfo.expiresIn}');
_getUserInfo();
} catch (error) {
if (error is KakaoException && error.isInvalidTokenError()) {
_logger.warning('토큰 만료: $error');
} else {
_logger.severe('토큰 정보 조회 실패: $error');
}
await loginWithKakaoAccount();
}
} else {
_logger.warning('발급된 토큰 없음');
await loginWithKakaoAccount();
}
}
Future<void> loginWithKakaoAccount() async {
if (await isKakaoTalkInstalled()) {
try {
OAuthToken token = await UserApi.instance.loginWithKakaoTalk();
_logger.info('카카오톡으로 로그인 성공: ${token.accessToken}');
_getUserInfo();
} catch (error) {
_logger.severe('카카오톡으로 로그인 실패: $error');
if (error is PlatformException && error.code == 'CANCELED') {
return;
}
await _loginWithKakaoAccountFallback();
}
} else {
await _loginWithKakaoAccountFallback();
}
}
Future<void> _loginWithKakaoAccountFallback() async {
try {
OAuthToken token = await UserApi.instance.loginWithKakaoAccount();
_logger.info('카카오계정으로 로그인 성공: ${token.accessToken}');
_getUserInfo();
} catch (error) {
_logger.severe('카카오계정으로 로그인 실패: $error');
}
}
- 챗지피티를 이용해서 알고리즘 설명을 정리함
- 코드는 kakao_flutter_sdk, flutter/services, logging 등의 패키지들을 불러옵니다.
- final Logger _logger = Logger('Kakao Login'); 이 부분은 로그를 관리하는 Logger 객체를 생성합니다. 이 로거는 "Kakao Login"이라는 이름으로 생성됩니다.
- _get_user_info() 함수는 Kakao 사용자의 정보를 얻는 것을 시도하고, 성공하면 로거를 사용하여 회원 번호와 닉네임을 정보로 로그에 출력합니다. 만약 실패하면 에러 메시지를 severe(심각한) 로그로 출력합니다.
- signInWithKakao() 함수는 카카오로 로그인하는 메인 함수입니다. 이 함수는 비동기적으로 작동하며, 다음 단계들을 수행합니다:
- 먼저, 이미 토큰이 존재하는지 AuthApi.instance.hasToken()을 통해 확인합니다.
- 토큰이 존재하면, UserApi.instance.accessTokenInfo()를 통해 토큰 정보를 얻어옵니다.
- 토큰 정보가 정상적으로 얻어지면, 토큰의 유효성 체크가 성공했다는 로그를 출력하고 _get_user_info() 함수를 호출하여 사용자 정보를 얻습니다.
- 토큰 정보를 얻는 도중 에러가 발생하면, 카카오 예외 처리를 하여 토큰 만료 여부를 확인하고 그에 따른 로그를 출력합니다. 그 후 loginWithKakaoAccount() 함수를 호출하여 새로운 토큰을 얻습니다.
- 토큰이 존재하지 않는 경우에도 loginWithKakaoAccount() 함수를 호출하여 새로운 토큰을 얻습니다.
- loginWithKakaoAccount() 함수는 카카오톡이 설치되어 있는지 확인하고, 설치되어 있다면 카카오톡으로 로그인을 시도합니다.
- 카카오톡으로 로그인에 성공하면, 로그인 성공 로그를 출력하고 사용자 정보를 얻습니다.
- 로그인에 실패하면, 로그인 실패 로그를 출력하고 특정 에러(사용자가 로그인을 취소한 경우)가 아닌 경우에는 카카오계정으로 로그인을 시도합니다.
- 카카오톡이 설치되어 있지 않은 경우에도 바로 카카오계정으로 로그인을 시도합니다.
- _loginWithKakaoAccountFallback() 함수는 카카오계정으로 로그인을 시도하고, 성공하면 로그인 성공 로그를 출력하고 사용자 정보를 얻습니다. 실패하면 로그인 실패 로그를 출력합니다.
이 코드는 카카오 로그인 프로세스를 효과적으로 관리하고, 각 단계에서 발생하는 상황을 로그로 기록하여 추후 분석이나 디버깅에 활용합니다.
=> 최종적으로 카카오 로그인 버튼에 signInWithKakao() 함수를 엮음
import '../model/kakao_login.dart';
...
Column(mainAxisSize: MainAxisSize.max, children: [
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(0, 0, 0, 20),
child: LoginButton(
imagePath: 'lib/images/login/kakao_login.png',
height: 55,
onPressed: () => signInWithKakao(),
),
),
...
'Flutter > Develop History' 카테고리의 다른 글
[Flutter on Mac] 플러터 애드몹(Admob) 보상형광고 연동과정 - 23.07.06 (1) | 2023.07.06 |
---|---|
[Flutter on Mac] 플러터 스플래쉬 이미지 적용하기 - 23.07.06 (0) | 2023.07.06 |
[Flutter on mac] VSCode에서 Dart 코드 작성시 엔터칠 때 자동완성 방지하는 방법 - 23.07.02 (0) | 2023.07.02 |