개발/PHP

Laravel 패키지 Socialite 설정 및 사용방법

buchet 2023. 7. 22. 22:59

오늘은 laravel breeze 환경에서 socialite 패키지를 사용 한 소셜로그인 연동 및 users 테이블 트랜잭션까지의

설명을 작성하려 합니다.

 

카카오, 네이버 먼저 소셜로그인을 구현해보겠습니다.

해당글은 socialite에 대한 사용예시를 작성하는것이기에 카카오,네이버 애플리케이션 생성부터 설정에 대한 부분은

작성하지 않습니다.. (사실 카카오, 네이버에 작성 된 문서가 더 깔끔합니다..ㅎㅎ)

 

카카오 로그인 가이드 문서 : https://developers.kakao.com/docs/latest/ko/kakaologin/common

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

네이버 로그인 가이드 문서 : https://developers.naver.com/docs/login/devguide/devguide.md#%EB%84%A4%EC%9D%B4%EB%B2%84%20%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B0%9C%EB%B0%9C%EA%B0%80%EC%9D%B4%EB%93%9C

 

네이버 로그인 개발가이드 - 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에서는 쉽게 소셜 로그인 연동을 도와주는 패키지가 있다는것을 알려드리기 위한 글이었습니다.

 

궁금하신 부분이 있으면 언제든 댓글 부탁 드립니다.

감사합니다!