관리 메뉴

Dev Blog

20210311 23일차 카카오, 구글 소셜 로그인 구현 완료(OAuth) 본문

BootCamp_Codestates/Final Project

20210311 23일차 카카오, 구글 소셜 로그인 구현 완료(OAuth)

Nomad Kim 2021. 3. 12. 04:18

구현 사항

  • 카카오, 구글 소셜 로그인 및 로그아웃

  • 메인 페이지(로그인 화면) CSS 리팩토링 (파트별 크기)

카카오, 구글 소셜 로그인 및 로그아웃 구현

 

1. 카카오

카카오는 SDK 를 이용하여 구현했는데, 카카오 OAuth 의 경우, 유저의 이메일 제공 여부가 선택사항이기 때문에 아래와 같은 경우의 수가 발생한다. Email 이 제공되지 않았을 경우엔 바로 추가정보 기입 모달로 보내고, Email 이 제공된 경우는,

 

구현 상 크게 어려운 부분은 의외로 없었는데, 소셜 로그인 모달에서 추가정보 기입 모달로 이동 시킬때 상태 끌어올리기를 사용했는데, 좀 헷갈렸다.

 

유저가 로그아웃을 할 경우에는, 아래 로직으로 로컬 스토리지에 저장되어 있던 카카오 인증 엑세스 토큰을 삭제해준다.

	if (window.Kakao.Auth.getAccessToken()) {
						console.log("카카오 인증 엑세스 토큰 존재", window.Kakao.Auth.getAccessToken());
						window.Kakao.Auth.logout(() => {
							console.log("카카오 로그아웃 완료", window.Kakao.Auth.getAccessToken());
						});
					}

 

2. 구글

구글 소셜 로그인의 경우, 타입스크립트를 적용할 시 sdk 사용이 불가하여 구글 로그인 라이브러리를 사용하여 구현했다.

카카오 소셜 로그인과 마찬가지의 경우의 수를 갖기 때문에 어렵지 않게 구현할 수 있었다.

다만, 소셜 로그인 모달창에서 props 를 이용(상태끌어올리기)하여 추가기입 모달창을 띄우는데, 조금 헷갈렸다.

import { GoogleLogin } from "react-google-login";

중략

export default function SocialModal(props: Props): ReactElement {

중략

	const googleLogin = async (response: any) => {
		const emailOffered = response.Is.ot;
		await axios
			.post(
				"https://royal-diary.ml/users/isemail",
				{ email: emailOffered },
				{
					headers: { "Content-Type": "application/json" },
					withCredentials: true,
				}
			)
			.then((res) => {
				// 기 존재하는 회원일 경우, accesstoken 을 받기 때문에 바로 로그인 상태 변경 및 session 에 토큰 저장 필요
				// 존재하지 않는 회원일 경우, 추가정보 기입 모달창을 띄운다.
				if (res.data.message === "not exists") {
					conveySocialData(emailOffered, "google");
					setSocialModal();
					return;
				}
				const nicknameOffered = res.data.data.nickname;
				const accessTokenOffered = res.data.data.accessToken;
				sessionStorage.setItem("accessToken", accessTokenOffered);
				sessionStorage.setItem("isLogin", JSON.stringify(true));
				sessionStorage.setItem("nickName", nicknameOffered);
				setModalMessage("오늘은 어떤 일이 있었나요?:)");
				setModalVisible(true);
			})
			.catch((err) => {
				console.log(err);
			});
	};

	return (
		<Modal isOpen={modalIsOpen} style={ModalStyles}>
			<ModalBox>
				<Title>쏘샬 로그인으로 입장하기</Title>
				<Buttons>
					<ImgWrapper className="g-signin2">
						<GoogleLogin
							clientId="구글 클라이언트 아이디 기입"
							render={(renderProps) => (
								<GoogleBtn type="button" onClick={renderProps.onClick} disabled={renderProps.disabled}>
									<img src={googleLogo} style={logoStyle} alt="" />
								</GoogleBtn>
							)}
							buttonText="Login"
							onSuccess={googleLogin}
							onFailure={googleLogin}
							cookiePolicy="single_host_origin"
							style={{ backgroundColor: "red" }}
						/>
					</ImgWrapper>
					<ImgWrapper onClick={kakaoLogin}>
						<img src={kakaoLogo} style={logoStyle} alt="" />
					</ImgWrapper>
					<ImgWrapper>
						<img src={githubLogo} style={logoStyle} alt="" />
					</ImgWrapper>
				</Buttons>
				<BackBtn>
					<button onClick={closeModal} type="button" style={btnStyle}>
						뒤로 가기
					</button>
				</BackBtn>
			</ModalBox>
			<NotificationModal modalIsOpen={modalVisible} setIsOpen={setModalVisible} message={modalMessage} />
		</Modal>
	);
}

구글로부터 아래의 유저데이터를 받게 되는데, 구글의 경우 email 이 필수적으로 제공된다.

메인 페이지(로그인 화면) CSS 리팩토링 (파트별 크기)

바꾸는 중...

 

해야할일

  • 구글 엑세스 토큰의 경우, 로컬스토리지에 담기지 않는것 같다. 라이브러리를 사용해서 그런것 같긴한데, 어떻게 로그아웃을 시켜야 할지 좀 더 알아봐야겠다.

  • 이제와 생각해보니, 유저가 소셜 로그인으로 들어와 추가 정보를 기입할 때 a 이메일(유저 제공)로 들어와서 b 이메일(추가 정보 기입할 때 이메일 변경)로 가입을 하게 될경우 문제가 발생할 것 같다. 생각 좀 해봐야겠다.

  • 메뉴얼 페이지와 제작자 페이지 구현이 필요하다. 그리고 CSS와 반응형 웹을 더 손봐야겠다.

  • 클라이언트 https 배포

도움받은 사이트

카카오 로그아웃 하는법: webruden.tistory.com/272

React Google Login: www.npmjs.com/package/react-google-login

Comments