애플 로그인 구현 완료

This commit is contained in:
eld_master 2025-02-07 21:20:32 +09:00
parent db2188e6fb
commit 6fa3302f3a

View File

@ -23,12 +23,16 @@ import 'package:google_sign_in/google_sign_in.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'dart:io' show Platform;
/* 애플 로그인 */
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
/* 광고 */
import 'package:google_mobile_ads/google_mobile_ads.dart';
/* 메인 페이지 */
import '../room/main_page.dart';
/* 설정 */
import '../../config/config.dart';
@ -235,135 +239,78 @@ class _LoginPageState extends State<LoginPage> {
//
// (D4) ()
// (D4)
//
Future<void> _appleLogin() async {
setState(() => _isLoading = true);
try {
// TODO:
showResponseDialog(context, 'Notice', 'Apple login will be implemented soon.');
// 1)
final appleCredential = await SignInWithApple.getAppleIDCredential(
scopes: [
AppleIDAuthorizationScopes.email,
AppleIDAuthorizationScopes.fullName,
],
);
// 2) Firebase credential
final oauthCredential = OAuthProvider('apple.com').credential(
idToken: appleCredential.identityToken,
accessToken: appleCredential.authorizationCode,
);
// 3) Firebase Auth로
final UserCredential userCredential =
await FirebaseAuth.instance.signInWithCredential(oauthCredential);
final User? user = userCredential.user;
if (user == null) {
showResponseDialog(context, 'Error' /* 오류 */,
'Apple login error. Please contact the administrator.'
/* 애플 로그인 오류. 관리자에게 문의해주세요. */);
return;
}
// 4) Firebase
final idToken = await user.getIdToken();
// 5)
final requestBody = {
'id_token': idToken,
};
final response = await Api.serverRequest(uri: '/user/apple/login', body: requestBody);
if (response['result'] == 'OK') {
final resp = response['response'] ?? {};
if (resp['result'] == 'OK') {
//
final prefs = await SharedPreferences.getInstance();
await prefs.setString('oauth_type', 'apple');
await prefs.setBool('auto_login', true);
await prefs.setString('jwt_token', resp['auth']['token'].toString());
await prefs.setInt('my_user_seq', resp['auth']['user_seq']);
//
Navigator.pushReplacement(context,
MaterialPageRoute(builder: (_) => const MainPage()));
} else {
showResponseDialog(context,
resp['response_info']['msg_title'],
resp['response_info']['msg_content']);
}
} else {
showResponseDialog(context, 'Error' /* 오류 */,
'Apple login request failed.' /* 애플 로그인 요청 실패 */);
}
} catch (e) {
showResponseDialog(context, 'Error', 'An error occurred during Apple login.\n$e');
_showAlert('Error' /* 오류 */,
'An error occurred during Apple login.\n$e'
/* 애플 로그인 중 오류가 발생했습니다.\n$e */);
} finally {
setState(() => _isLoading = false);
}
}
//
// (D3)
//
Future<void> _googleSignUp() async {
final agreed = await _showTermsModal();
if (agreed != true) {
return;
}
try {
// (2)
final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
if (googleUser == null) {
//
return;
}
// (3)
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
// (4) FirebaseAuth Credential
final AuthCredential credential = GoogleAuthProvider.credential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
// (5) FirebaseAuth로 "회원가입"
final UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(credential);
final User? user = userCredential.user;
if (user == null) {
showResponseDialog(context, 'Error' /* 오류 */, 'Google account authentication failed.'
/* 구글계정 인증에 실패했습니다. */);
return;
}
// (6) idToken ,
final idToken = await user.getIdToken();
final requestBody = {
'id_token': idToken,
};
final response = await Api.serverRequest(uri: '/user/google/signup', body: requestBody);
if (response['result'] == 'OK') {
final resp = response['response'] ?? {};
if (resp['result'] == 'OK') {
//
showResponseDialog(context, 'Sign-up Complete' /* 회원가입 완료 */, 'Google sign-up has been completed.'
/* 구글 회원가입이 완료되었습니다. */);
} else {
//
final msgTitle = resp['response_info']?['msg_title'] ?? 'Error' /* 오류 */;
final msgContent = resp['response_info']?['msg_content'] ?? 'Failed to sign up.'
/* 회원가입에 실패했습니다. */;
showResponseDialog(context, msgTitle, msgContent);
}
} else {
showResponseDialog(context, 'Error' /* 오류 */, 'Google sign-up request failed.'
/* 구글 회원가입 요청 실패 */);
}
} catch (e) {
showResponseDialog(context, 'Error' /* 오류 */, 'An error occurred during Google sign-up.\n$e'
/* 구글 회원가입 중 오류가 발생했습니다.\n$e */);
}
}
//
// (E) ( )
//
Future<bool?> _showTermsModal() async {
return showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (ctx) {
return AlertDialog(
backgroundColor: Colors.white,
title: const Text(
'Privacy Collection and Usage Agreement'
/* 개인정보 수집 및 이용 동의서 */,
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
content: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text(
Config.termsOfService,
style: const TextStyle(fontSize: 14),
),
],
),
),
actions: [
TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.black,
foregroundColor: Colors.white,
),
onPressed: () => Navigator.pop(ctx, false),
child: Text('Disagree'
/* 거부 */),
),
TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.black,
foregroundColor: Colors.white,
),
onPressed: () => Navigator.pop(ctx, true),
child: Text('Agree'
/* 동의 */),
),
],
);
},
);
}
//
// (F) Alert ( )