Skip to content

Commit

Permalink
[#1] Feat: 로그인 로직 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
cucumber99 committed Jun 29, 2024
1 parent cc739bd commit 5961bc9
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 28 deletions.
13 changes: 11 additions & 2 deletions lib/app_router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,17 @@ final routerProvider = Provider<GoRouter>((ref) {
),
],
redirect: (context, state) {
return null;
final currentState = state.fullPath == "/login";
final isLogin = authState.isLogin;

if (currentState && isLogin) {
return '/';
}

//리다이렉트 로직 필요
if (!currentState && !isLogin) {
return '/login';
}

return null;
});
});
10 changes: 5 additions & 5 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import 'package:skhuthon_app/app_router.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
KakaoSdk.init(nativeAppKey: '0065524053bb6be5edf838e8a5884eb8');
log(await KakaoSdk.origin);
await NaverMapSdk.instance.initialize(
clientId: 'qop4zo2ija',
onAuthFailed: (e) {
log('네이버 지도 인증 오류 : $e');
}
);
clientId: 'qop4zo2ija',
onAuthFailed: (e) {
log('네이버 지도 인증 오류 : $e');
});
runApp(const ProviderScope(child: App()));
}

Expand Down
44 changes: 38 additions & 6 deletions lib/providers/auth_provider.dart
Original file line number Diff line number Diff line change
@@ -1,26 +1,35 @@
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/widgets.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:http/http.dart' as http;
import 'package:kakao_flutter_sdk/kakao_flutter_sdk.dart' as k;
import 'package:kakao_flutter_sdk/kakao_flutter_sdk_auth.dart';
import '../models/user.dart';

class AuthController with ChangeNotifier {
bool isLogin = false;
FlutterSecureStorage storage = const FlutterSecureStorage();

Future<User?> loginWithKakao() async {
try {
OAuthToken token;
if (await k.isKakaoTalkInstalled()) {
try {
await k.UserApi.instance.loginWithKakaoTalk();
token = await k.UserApi.instance.loginWithKakaoTalk();
log("카카오톡 로그인 성공");
} catch (e) {
log("카카오톡 로그인 실패 : $e");
await k.UserApi.instance.loginWithKakaoAccount();
token = await k.UserApi.instance.loginWithKakaoAccount();
log("카카오 계정 로그인 성공");
}
} else {
await k.UserApi.instance.loginWithKakaoAccount();
token = await k.UserApi.instance.loginWithKakaoAccount();
log("카카오 계정 로그인 성공");
}
k.User kakaoUser = await k.UserApi.instance.me();
await storage.write(key: 'kakaoToken', value: token.accessToken);
return User(
name: kakaoUser.kakaoAccount!.name!,
email: kakaoUser.kakaoAccount!.email!,
Expand All @@ -31,15 +40,38 @@ class AuthController with ChangeNotifier {
}
}

Future<void> login() async {
User? user = await loginWithKakao();
Future<void> login(User? user) async {
String? token = await storage.read(key: 'kakaoToken');
if (user != null) {
//서버 로그인 로직 필요
final response = await http.get(
Uri.parse('http://54.180.215.240:8080/api/v1/kakao/callback?code=$token'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);

if (response.statusCode == 200) {
final data = jsonDecode(response.body);
final String accessToken = data['data'];
log(accessToken.toString());
await storage.write(key: 'accessToken', value: accessToken);
}
else {
log('로그인 실패: ${response.statusCode}');
}

isLogin = true;
notifyListeners();
} else {
return;
}
}

Future<void> logout() async {
//서버 로그아웃 로직 필요
isLogin = false;
notifyListeners();
}
}

final authProvider = ChangeNotifierProvider((ref) => AuthController());
17 changes: 17 additions & 0 deletions lib/providers/user_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';

import '../models/user.dart';

class UserStateNotifier extends StateNotifier<User?> {
UserStateNotifier() : super(null);

void setUser(User user) {
state = user;
}

void clearUser() {
state = null;
}
}

final userProvider = StateNotifierProvider<UserStateNotifier, User?>((ref) => UserStateNotifier());
20 changes: 8 additions & 12 deletions lib/screens/login/login_screen.dart
Original file line number Diff line number Diff line change
@@ -1,27 +1,18 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:skhuthon_app/providers/auth_provider.dart';
import 'package:skhuthon_app/providers/user_provider.dart';

import '../../common/color.dart';

// 상태 관리를 위한 Provider 선언
final loginProvider = ChangeNotifierProvider((ref) => LoginProvider());

class LoginProvider extends ChangeNotifier {
// 필요한 상태 변수 선언
// 예: 로그인 버튼 클릭 여부 등

// 상태 변수 관련 메소드 구현
// 예: 로그인 버튼 클릭 처리 등
}

class LoginScreen extends ConsumerWidget {
const LoginScreen({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
final size = MediaQuery.of(context).size;
final authController = ref.watch(authProvider);
final userState = ref.read(userProvider.notifier);

return Scaffold(
backgroundColor: WHITE,
Expand All @@ -46,7 +37,12 @@ class LoginScreen extends ConsumerWidget {
),
ElevatedButton(
onPressed: () async {
await authController.login();
await authController.loginWithKakao().then((user) {
if (user != null) {
authController.login(user);
userState.setUser(user);
}
});
},
style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(
Expand Down
4 changes: 2 additions & 2 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ packages:
source: hosted
version: "3.0.3"
dio:
dependency: "direct main"
dependency: transitive
description:
name: dio
sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5"
Expand Down Expand Up @@ -321,7 +321,7 @@ packages:
source: hosted
version: "2.5.1"
http:
dependency: transitive
dependency: "direct main"
description:
name: http
sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ dependencies:
go_router: ^14.2.0
hooks_riverpod: ^2.5.1
flutter_hooks: ^0.20.5
dio: ^5.4.3+1
http: ^1.2.0
kakao_flutter_sdk: ^1.9.2
flutter_secure_storage: ^9.2.2
salomon_bottom_bar: ^3.3.2
Expand Down

0 comments on commit 5961bc9

Please sign in to comment.