Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

네이버 로그인 구현 #91

Draft
wants to merge 7 commits into
base: release/2024-summer
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added assets/login_page_images/naver.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
77 changes: 75 additions & 2 deletions lib/feature/login/LoginScreen.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import 'dart:async';

import 'package:blueberry_flutter_template/feature/camera/CameraScreen.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:app_links/app_links.dart';
import 'package:blueberry_flutter_template/utils/Talker.dart';

import '../../core/widget/SquareTitleWidget.dart';
import '../../services/FirebaseAuthServiceProvider.dart';
Expand All @@ -26,11 +31,73 @@ final wantEditNameProvider = StateProvider<bool>((ref) => false);

///# 로그인 화면
///* 이메일, 소셜(구글,애플,깃허브) 로그인 기능 제공
class LoginScreen extends ConsumerWidget {
class LoginScreen extends ConsumerStatefulWidget {
const LoginScreen({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
LoginScreenState createState() => LoginScreenState();
}

class LoginScreenState extends ConsumerState<LoginScreen> {
StreamSubscription? _sub;

//initAppLinks()는 초기 링크만 처리하고, 실시간 딥 링크 구독은 initState()에서 처리
Future<void> initAppLinks() async {
final appLinks = AppLinks();
final initialLink = await appLinks.getInitialLink();
if (initialLink != null) {
try {
handleDeepLink(initialLink); // 초기 딥링크 처리
} catch (e) {
talker.error("초기 딥 링크 처리 중 오류 발생: $e");
}
}
}

Future<void> handleDeepLink(Uri uri) async {
try {
if (uri.authority == 'login-callback') {
final firebaseToken = uri.queryParameters['firebaseToken'];
final String? name = uri.queryParameters['name'];
final String? profileImage = uri.queryParameters['profileImage'];

if (firebaseToken != null) {
UserCredential userCredential =
await FirebaseAuth.instance.signInWithCustomToken(firebaseToken);
await userCredential.user?.updateDisplayName(name);
await userCredential.user?.updatePhotoURL(profileImage);
} else {
throw Exception('Firebase token이 존재하지 않습니다.');
}
}
} catch (e) {
talker.error("딥 링크 처리 중 오류 발생: $e");
}
}

@override
void initState() {
super.initState();
initAppLinks(); // 초기 딥 링크 처리

// 실시간 딥 링크 구독
_sub = AppLinks().uriLinkStream.listen((Uri? link) {
if (link != null) {
handleDeepLink(link);
}
}, onError: (err) {
talker.error("딥 링크 수신 중 오류 발생: $err");
});
}

@override
void dispose() {
_sub?.cancel(); // 구독 해제
super.dispose();
}

@override
Widget build(BuildContext context) {
// 페이지 정보를 가져오는 상태 관리 객체
final pageState = ref.watch(pageProvider);
// 로그인 상태를 가져오는 상태 관리 객체
Expand Down Expand Up @@ -196,6 +263,12 @@ Widget _buildLogin(BuildContext context, WidgetRef ref) {
SquareTileWidget(
onTap: () => SocialAuthService().signInWithGithub(),
imagePath: 'assets/login_page_images/github.png'),
const SizedBox(
width: 10,
),
SquareTileWidget(
onTap: () => SocialAuthService().signInWithNaver(),
imagePath: 'assets/login_page_images/naver.png'),
],
),
],
Expand Down
2 changes: 1 addition & 1 deletion lib/router/RouterProvider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -143,4 +143,4 @@ final routerProvider = Provider<GoRouter>((ref) {
),
],
);
});
});
28 changes: 28 additions & 0 deletions lib/services/socialauth/SocialAuthService.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:convert';
import 'dart:math';

Expand All @@ -12,6 +13,8 @@ import 'package:flutter/services.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:firebase_remote_config/firebase_remote_config.dart';

import '../../utils/Talker.dart';

Expand Down Expand Up @@ -89,6 +92,31 @@ class SocialAuthService {
getAuthenticateWithFirebase(userCredential, AppStrings.usingGithubLogin);
}

///Naver Sign In
Future<void> signInWithNaver() async {
final remoteConfig = FirebaseRemoteConfig.instance;
await remoteConfig.fetchAndActivate();

final String clientId = remoteConfig.getString('naver_client_id');
final String redirectUri = remoteConfig.getString('naver_redirect_uri');
final String state = generateNonce();

final Uri url = Uri.parse(
'https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=$clientId&redirect_uri=$redirectUri&state=$state');

try {
final bool launched =
await launchUrl(url, mode: LaunchMode.externalApplication);
if (!launched) {
talker.error('네이버 로그인 URL 런칭 실패: $url');
throw Exception('네이버 로그인 URL 런칭 실패');
}
} catch (e) {
talker.error('네이버 로그인 URL 런칭 중 오류 발생: $e');
throw Exception('네이버 로그인 중 오류 발생: $e');
}
}

///* 인증정보를 바탕으로 firestore에 저장하는 함수
void getAuthenticateWithFirebase(
UserCredential? credential, String socialCompany) async {
Expand Down
3 changes: 2 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ dependencies:

# Core
flutter_riverpod: ^2.5.1
url_launcher: ^6.2.6
url_launcher: ^6.3.0
uuid: ^4.4.0

# Freezed
Expand All @@ -32,6 +32,7 @@ dependencies:
firebase_analytics: ^11.2.1
cloud_firestore: ^5.0.2
firebase_database: ^11.0.4
firebase_remote_config: ^5.1.0

# Kakao
kakao_flutter_sdk_share: ^1.9.5
Expand Down
Loading