Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 피보나치 함수
- suffixicon
- next.js
- TextFormField
- Github Actions
- ZOD
- locale data
- useEffect
- Props Drilling
- 사탕게임
- 프로그래머스
- visual test
- Flutter
- 백준
- context api
- Python
- javascript
- react
- React.memo
- storybook
- kakao blind recruitment
- React-hook-form
- Vanilla JavaScript
- useMemo
- interaction test
- 이메일 인증
- 리팩토링
- typescript
- custom hook
- next-auth
Archives
- Today
- Total
Dev Diary
[Question Cloud] 회원가입 만들기 (3) 본문
SMALL
드디어 회원가입의 마지막인 소셜 회원가입을 구현해보았다. 사실 소셜 회원가입은 구현해두면 로그인에도 같이 써먹을 수 있기 때문에 register 폴더 하위에 넣지 않고 따로 분리해주었다.
1. 카카오톡 간편 가입하기 버튼 클릭 시 카카오 로그인 화면 호출하기
아래 이미지에서 카카오톡 간편 가입하기 버튼을 누르면 handleKakaoLogin() 함수를 통해 카카오 로그인 페이지를 호출할 수 있도록 해주었다.
const handleKakaoLogin = () => {
if (KAKAO_API_KEY && KAKAO_REDIRECT_URI) {
const kakaoAuthUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${KAKAO_API_KEY}&redirect_uri=${KAKAO_REDIRECT_URI}&response_type=code`;
window.location.href = kakaoAuthUrl;
}
};
2. 인가코드를 서버에 전송하고 응답받기
로그인 후 url 파라미터에 code 값을 파싱하여 accountType과 함께 서버에 넘겨줌으로 아래와 같은 Response를 받을 수 있다.
"use client";
import React, { useEffect } from "react";
import { useSearchParams } from "next/navigation";
import { useOAuthApi, SimpleAlarmDialog } from "@/shared";
import { useNavigator, useUserSession } from "@/hooks";
import { useDialogContext } from "@/providers";
const KakaoRedirect = () => {
const searchParams = useSearchParams();
const code = searchParams.get("code");
const accountType = "KAKAO";
const { userLogin } = useUserSession();
const { handleNavigate } = useNavigator();
const { dialogOpen, dialogClose } = useDialogContext();
const { mutate: kakaoCallback, data: kakaoCallbackData, error: kakaoCallbackError } = useOAuthApi();
// code 값이 있다면 서버로 API 요청하기
useEffect(() => {
if (code) {
kakaoCallback({ accountType, code });
}
}, [code, kakaoCallback]);
// 요청한 API에 대한 응답 기반 적절한 처리
useEffect(() => {
if (kakaoCallbackData) {
// 1. 이미 가입한 사용자라면 로그인 진행
if (kakaoCallbackData.isRegistered === true) {
const accessToken = kakaoCallbackData.authenticationToken.accessToken;
const refreshToken = kakaoCallbackData.authenticationToken.refreshToken;
userLogin({ accessToken, refreshToken });
}
// 2. 아직 가입하지 않은 사용자라면 회원가입을 진행해달라는 Dialog와 함께 회원가입 화면으로 이동
else if (kakaoCallbackData.isRegistered === false) {
dialogOpen();
}
}
}, [kakaoCallbackData, dialogOpen, userLogin]);
useEffect(() => {
if (kakaoCallbackError) {
dialogOpen();
}
}, [dialogOpen, kakaoCallbackError]);
return (
<>
{kakaoCallbackError && (
<SimpleAlarmDialog
message={kakaoCallbackError.message}
onClose={() => {
dialogClose();
handleNavigate(`/`);
}}
/>
)}
{kakaoCallbackData && !kakaoCallbackData.isRegistered && (
<SimpleAlarmDialog
message={"회원가입을 진행해주세요"}
onClose={() => {
dialogClose();
handleNavigate(`/register/kakao?registerToken=${kakaoCallbackData.registerToken}`);
}}
/>
)}
</>
);
};
export { KakaoRedirect };
결과 화면
이미 카카오쪽에 로그인을 진행한 상태라서 중간에 로그인하는 부분이 생략되었다. 원래 아래와 같이 로그인하는 화면과 동의하는 화면이 떠야한다.
또한, 일반 이메일 가입에는 비밀번호를 기입하는 부분이 필요하지만, 소셜 로그인 같은 경우 비밀번호를 사용하지 않기 때문에 소셜 회원가입을 진행하는 경우 닉네임, 이메일, 전화번호만 입력할 수 있도록 수정해주었다.
다음 게시글에서는 accessToken, refreshToken을 이용해 세션을 유지하는 방법을 고려하여 가입한 이메일로 로그인하는 기능과 카카오 계정으로 로그인하는 로그인 기능을 만들어보겠다.
LIST
'Projects' 카테고리의 다른 글
바닐라 자바스크립트 프로젝트 초기 환경 설정 (2) | 2024.11.11 |
---|---|
[Question Cloud] 회원가입 만들기 (2) (9) | 2024.10.09 |
[Question Cloud] 회원가입 만들기 (1) (2) | 2024.10.06 |
[Question Cloud] Chromatic을 활용한 Storybook 배포 (0) | 2024.09.03 |
[Question Cloud] Storybook 과 Testing 설정하기 (0) | 2024.08.23 |