Laravel 패키지 Socialite 설정 및 사용방법
오늘은 laravel breeze 환경에서 socialite 패키지를 사용 한 소셜로그인 연동 및 users 테이블 트랜잭션까지의
설명을 작성하려 합니다.
카카오, 네이버 먼저 소셜로그인을 구현해보겠습니다.
해당글은 socialite에 대한 사용예시를 작성하는것이기에 카카오,네이버 애플리케이션 생성부터 설정에 대한 부분은
작성하지 않습니다.. (사실 카카오, 네이버에 작성 된 문서가 더 깔끔합니다..ㅎㅎ)
카카오 로그인 가이드 문서 : https://developers.kakao.com/docs/latest/ko/kakaologin/common
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
네이버 로그인 개발가이드 - LOGIN
네이버 로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아이디
developers.naver.com
1. composer 를 사용하여 socialite 설치
- composer require laravel/socialite
1-1. 네이버,카카오 소셜 로그인 연동을 위한 설치
- composer require socialiteproviders/kakao (카카오)
- composer require socialiteproviders/naver (네이버)
2. 프로젝트 파일 내 설정
- .env 파일 설정
각 변수에 애플리케이션에서 확인 가능 한 key들을 입력해줍니다.
redirect uri는 자신의 프로젝트 내에서 호출 할 url을 작성해줍니다.(각 애플리케이션에 등록해줘야 하는 정보)
- config > services.php 파일에 필요한 정보 추가
- app > Providers > EventServiceProvider.php 파일 필요한 정보 추가
Registered key 아래에 \Social 로 시작하는 부분 추가
- routes > web.php 파일 route 추가
- Controllers > Web > SocialController.php Method 추가
with Method에 service_terms 를 추가 한 이유는 약관정보가 추가 될 경우 재호출하라는 부분으로 추가
// 인증받은 값을 처리하는 메서드
public function loginCallback(string $provider)
{
$socialUser = Socialite::driver($provider)->user();
$message = '';
try {
$socialId = $socialUser->id ?? null;
$name = $socialUser->name ?? null;
$email = $socialUser->email ?? null;
$password = \getRandomString((15));
if ($name === null) {
throw new \Exception($provider. ' 회원정보를 확인 할 수 없습니다.');
}
// 회원정보 있는지 체크
$user = User::where('email', $email)->first();
$socialUser = SocialUser::where('user_id', $socialId)->first();
// 트랜잭션 시작
DB::beginTransaction();
$socialType = [
'kakao' => 1,
'naver' => 2
];
// 없으면 회원가입 처리
if (!$user && !$socialUser) {
$user = User::create([
'name' => $name,
'email' => $email,
'password' => Hash::make($password),
]);
SocialUser::create([
'social_type' => $socialType[$provider],
'social_id' => $socialId,
'user_id' => $user->id
]);
} else if ($user && !$socialUser) {
// 회원정보가 있는데 소셜정보는 없을경우 소셜정보를 추가 (어떤 소셜정보로 접속해서 이메일이 동일하면 로그인 가능하도록)
// 통합 로그인 형태
SocialUser::create([
'social_type' => $socialType[$provider],
'social_id' => $socialId,
'user_id' => $user->id
]);
}
event(new Registered($user));
// 모든 작업이 성공적으로 완료되면 트랜잭션을 커밋하여 변경사항을 유지합니다.
DB::commit();
Log::info('트랜잭션 성공');
Auth::login($user);
return redirect(RouteServiceProvider::HOME);
} catch (\Exception $e) {
// 예외 발생 시 트랜잭션을 롤백하여 변경사항을 취소합니다.
DB::rollback();
$message = $e->getMessage();
Log::error('트랜잭션 실패'. $message);
}
echo "<script>alert('".$message."');window.location.href='/login';</script>";
}
저는 users에 있는 회원 메인정보와 social_users 테이블의 소셜 회원정보를 따로 관리하여 1:N 관계로 구축하려고
이렇게 진행하였습니다.
그래서 최종적으로 db transaction 이 완료되면 아래와 같이 db table에 insert 됩니다.
users
- row 첫번째 일반 회원, 두번째는 소셜회원
social_users
- row 첫번째는 카카오, 두번째는 네이버 정보를 저장하였습니다.
- 그럼 user_id 25번은 네이버,카카오 모두 로그인 가능 한 구조로 처리하였습니다.
설명이 좀 난잡한데.. 결론은 Laravel에서는 쉽게 소셜 로그인 연동을 도와주는 패키지가 있다는것을 알려드리기 위한 글이었습니다.
궁금하신 부분이 있으면 언제든 댓글 부탁 드립니다.
감사합니다!