문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.
___앱 id 1065736
스프링부트 , 플러터
로그인 버튼을 눌러서 새창으로 로그인이 진행되면 컨트롤러의 리턴이 새창으로 가지는거 같습니다. 원래 이런건가요? 그렇다면 로그인버튼을 눌렀을때 200응답으로 메인페이지로 전환되게 했는데 이것을 처리하는 방법이궁금합니다. 왼쪽화면이 로그인 창이고 새창이 열리면서 로그인이 진행되는게 오른쪽 창입니다.
@GetMapping("/oauth/kakao/callback")
public ResponseEntity<String> login(@RequestParam String code, HttpServletRequest httpServletRequest){
OauthToken oauthToken = memberService.requestToken(code);
KakaoProfile kakaoProfile = memberService.requestKakaoProfile(oauthToken);
Member findMember = memberService.findMemberByUserId(kakaoProfile.getId().toString());
if (findMember!=null) {
memberService.sessionSave(httpServletRequest, findMember, oauthToken);
return ResponseEntity.status(200).body("login");
} else {
Member newMember = new Member(
ROLE_USER,
kakaoProfile.getKakao_account().getProfile().getProfile_image_url(),
kakaoProfile.getId().toString(),
kakaoProfile.getKakao_account().getProfile().getNickname());
memberService.addMember(newMember);
memberService.sessionSave(httpServletRequest, newMember, oauthToken);
return ResponseEntity.status(200).body("new-member");
}
}
컨트롤러입니다
블록 따옴표
class Login extends StatefulWidget {
const Login({Key? key}) : super(key: key);
@override
LoginState createState() => _LoginState();
}
class _LoginState extends State<Login> {
StreamSubscription? _sub;
@override
void initState() {
super.initState();
_initUniLinks();
}
Future<void> _initUniLinks() async {
try {
_sub = uriLinkStream.listen((Uri? uri) {
if (uri != null &&
uri.toString().startsWith(
"http://ceprj.gachon.ac.kr:60022/api/oauth/kakao/callback")) {
_handleCallback(uri);
}
}, onError: (Object err) {
// 에러 처리
print('Error occurred in uriLinkStream: $err');
});
} on PlatformException catch (e) {
// 구체적인 예외 처리
print('PlatformException: $e');
}
}
@override
void dispose() {
_sub?.cancel();
super.dispose();
}
Future<void> _loginWithKakao(BuildContext context) async {
const String clientId = 'c33ec31ce21c44a27c43a6165664cb5a';
const String redirectUri =
'http://ceprj.gachon.ac.kr:60022/api/oauth/kakao/callback';
final String kakaoUrl =
'https://kauth.kakao.com/oauth/authorize?client_id=$clientId&redirect_uri=$redirectUri&response_type=code';
final Uri url = Uri.parse(kakaoUrl);
print('Attempting to launch: $kakaoUrl');
try {
// 외부 브라우저로 Kakao 인증 페이지로 이동
await launchUrl(url);
print('Launched URL');
} catch (e) {
print('Could not launch $kakaoUrl: $e');
}
}
Future<void> _handleCallback(Uri callbackUri) async {
final code = callbackUri.queryParameters['code'];
if (code != null) {
try {
final response = await http.get(
Uri.parse(
'http://ceprj.gachon.ac.kr:60022/api/oauth/kakao/callback?code=$code'),
);
print('API call response: ${response.statusCode}');
print('API call response body: ${response.body}');
if (response.statusCode == 200) {
print('Login successful, navigating to Main page');
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const Main()),
);
} else {
print('Failed to login with Kakao: ${response.statusCode}');
// 실패한 경우 사용자에게 알림
_showErrorDialog(context,
'Failed to login with Kakao. Status code: ${response.statusCode}');
}
} catch (e) {
print('Exception during API call: $e');
_showErrorDialog(context, 'Exception during API call: $e');
}
} else {
print('No code found in callback URI');
_showErrorDialog(context, 'No code found in callback URI');
}
}
프론트코드입니다