1. 소개
Flutter로 애플 로그인(Apple Sign-In)을 구현하여 사용자 정보를 관리하는 방법을 소개합니다. Apple 로그인은 iOS 13 이상에서 사용할 수 있으며, 사용자 프라이버시를 중시하는 애플의 정책에 따라 사용자의 개인 정보 보호가 철저하게 관리됩니다.
이 튜토리얼에서는 다음과 같은 내용을 다룹니다:
- Apple 로그인 구현
- 사용자 정보를 Firebase Firestore에 저장 및 관리
2. Apple Sign-In 설정
2.1 Apple Developer 설정
먼저 Apple Developer 계정에서 Apple Sign-In을 설정해야 합니다.
- Apple Developer 계정에 로그인합니다.
- 앱 ID를 생성하거나 기존 앱 ID를 선택한 후, "Sign in with Apple"을 활성화합니다.
- "Service ID"를 생성하고 Apple Sign-In을 연결합니다.
2.2 Firebase 설정
Firebase 프로젝트를 설정하고, Firebase Auth와 Firestore를 사용하여 사용자 정보를 저장하고 관리합니다.
- Firebase 프로젝트 생성 후, Firebase Authentication에서 Apple 로그인 기능을 활성화합니다.
- iOS 프로젝트에 GoogleService-Info.plist 파일을 추가합니다.
- Podfile에 Firebase 및 Apple Sign-In 관련 라이브러리를 추가합니다.
# Podfile
platform :ios, '11.0'
use_frameworks!
target 'Runner' do
pod 'Firebase/Auth'
pod 'Firebase/Firestore'
end
3. 프로젝트 설정
3.1 플러그인 설치
프로젝트에서 필요한 플러그인을 설치합니다.
dependencies:
firebase_core: latest_version
firebase_auth: latest_version
cloud_firestore: latest_version
sign_in_with_apple: latest_version
3.2 iOS 설정
ios/Runner/Info.plist 파일을 열어 다음을 추가합니다.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
</dict>
</array>
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
또한, ios/Runner/Entitlements.plist 파일에 Apple Sign-In 권한을 추가합니다.
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
4. Apple 로그인 구현
4.1 Firebase 인증 서비스 설정
먼저, Apple 로그인 인증을 처리할 서비스를 작성합니다.
import 'package:firebase_auth/firebase_auth.dart';
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
Future<User?> signInWithApple() async {
try {
final appleCredential = await SignInWithApple.getAppleIDCredential(
scopes: [
AppleIDAuthorizationScopes.email,
AppleIDAuthorizationScopes.fullName,
],
);
final oauthCredential = OAuthProvider("apple.com").credential(
idToken: appleCredential.identityToken,
accessToken: appleCredential.authorizationCode,
);
final authResult = await _auth.signInWithCredential(oauthCredential);
final firebaseUser = authResult.user;
if (firebaseUser != null) {
final userRef = _firestore.collection('users').doc(firebaseUser.uid);
final userData = {
'uid': firebaseUser.uid,
'email': firebaseUser.email,
'displayName': firebaseUser.displayName ?? '',
'createdAt': FieldValue.serverTimestamp(),
};
await userRef.set(userData, SetOptions(merge: true));
return firebaseUser;
}
} catch (e) {
print("Error during Apple Sign-In: $e");
return null;
}
return null;
}
Future<void> signOut() async {
await _auth.signOut();
}
}
4.2 로그인 UI 구현
로그인 버튼을 제공하는 간단한 UI를 구현합니다.
import 'package:flutter/material.dart';
import 'package:your_project_name/services/auth_service.dart';
import 'package:your_project_name/screens/user_profile_screen.dart';
class LoginScreen extends StatelessWidget {
final AuthService _authService = AuthService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Apple Sign-In'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
User? user = await _authService.signInWithApple();
if (user != null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserProfileScreen(user: user),
),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to sign in with Apple')),
);
}
},
child: Text('Sign in with Apple'),
),
),
);
}
}
4.3 유저 프로필 화면
로그인 후 유저 정보를 보여주는 프로필 화면을 구현합니다.
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
class UserProfileScreen extends StatelessWidget {
final User user;
UserProfileScreen({required this.user});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('${user.displayName ?? "User"}\'s Profile'),
actions: [
IconButton(
icon: Icon(Icons.logout),
onPressed: () async {
await FirebaseAuth.instance.signOut();
Navigator.of(context).popUntil((route) => route.isFirst);
},
)
],
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Email: ${user.email}',
style: TextStyle(fontSize: 18),
),
SizedBox(height: 10),
Text(
'User ID: ${user.uid}',
style: TextStyle(fontSize: 18),
),
SizedBox(height: 20),
],
),
),
);
}
}
5. 맺음말
이제 Apple 로그인 기능을 사용해 사용자의 정보를 Firebase Firestore에 저장하고, 관리할 수 있게 되었습니다.
이 방법은 사용자의 개인정보 보호를 중요하게 생각하는 애플의 정책에 부합하며, 사용자의 Apple 계정 정보를 통해 보다 안전하고 간편한 로그인 경험을 제공합니다.
확장 포인트
- 다른 소셜 로그인 추가: Google, Facebook과 같은 다른 소셜 로그인을 추가하여 로그인 옵션을 다양화할 수 있습니다.
- 사용자 정보 업데이트: 사용자가 프로필 정보를 직접 업데이트할 수 있는 기능을 추가할 수 있습니다.
- 보안 강화: Firestore 보안 규칙을 설정하여 사용자가 본인의 정보만 접근할 수 있도록 보호합니다.
- 다크 모드 지원: 애플 로그인 UI를 다크 모드에 맞게 디자인할 수 있습니다.
Apple 로그인과 Firebase를 사용한 유저 관리 시스템을 구현함으로써, 안전하고 편리한 사용자 인증을 제공할 수 있습니다.
공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Flutter > Snippet' 카테고리의 다른 글
플러터 ElevatedButton: VS Code자동 완성 스니펫 (1) | 2024.09.24 |
---|---|
플러터에서 Google 로그인을 이용해 유저 정보를 관리하는 방법 (0) | 2024.08.29 |
플러터 앱에 Firebase를 이용하여 사용자 정보 관리 기능 추가하기 (6) | 2024.08.29 |
플러터에서 텍스트 타이핑 효과를 내는 위젯: 자세한 가이드 (0) | 2024.08.12 |
플러터에서 AdMob API로 수익 정보 조회하기 (6) | 2024.07.28 |