HEX
Server: nginx/1.28.3
System: Linux lightweb-s1 5.15.0-173-generic #183-Ubuntu SMP Fri Mar 6 13:29:34 UTC 2026 x86_64
User: drdrivek-71 (1047)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: /home/eslinced-103/brise-edu.or.kr/app/Http/Controllers/SocialLoginController.php
<?php

namespace App\Http\Controllers;

use App\Exceptions\CantOpenFileFromUrlException;
use App\Models\UserAccount;
use App\Services\UrlUploadedFile;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;

use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Laravel\Socialite\Facades\Socialite;
use Illuminate\Routing\Controller as BaseController;

class SocialLoginController extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    function socialLiteRedirect($provider): \Symfony\Component\HttpFoundation\RedirectResponse|\Illuminate\Http\RedirectResponse
    {
        return Socialite::driver($provider)->redirect();
    }

    function socialLiteCallback(Request $request, $provider): \Illuminate\Routing\Redirector|\Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse
    {
        $socialUser = Socialite::driver($provider)->user();


        $email = $socialUser->getEmail();
        if(!$email) {
            $userAccount = UserAccount::where([
                'id' => $socialUser->id,
                'provider' => $provider
            ])->first();
            if($userAccount) $email = $userAccount->user->email;
        }

        /** @var $user User */
        $user = User::query()->updateOrCreate([
            'email' => $email ?? sprintf("%s@%s",Str::random(),"eslincedu.com")
        ],[
            'name' => $socialUser->getNickname() ?? sprintf("%s %s %s %s",$this->getActionRand(), $this->getColorRand(), $this->getStrRand(),$this->getNameRand()),
        ]);

        $profileImage = $socialUser->getAvatar();
        if($profileImage != null && $profileImage != ''){
            try {
                if($user->getAttribute('profile_photo_path') != null){
                    Storage::disk('public')->delete($user->getAttribute('profile_photo_path'));

                    //storage에 이미지가 없다면 db의 profile_photo_path도 null로 수정
                    if (!Storage::disk('public')->exists($user->getAttribute('profile_photo_path'))) {
                        $user->update(['profile_photo_path' => null]);
                    }
                }

                $uploadedPhoto = UrlUploadedFile::createFromUrl($profileImage);
                $path = Storage::disk('public')->putFileAs('user_profiles', $uploadedPhoto, $user->getKey() . "." . $uploadedPhoto->getExtension(), 'public');
                unlink($uploadedPhoto->getPathname());
                $user->setAttribute('profile_photo_path',$path);
                $user->save();

            }
            catch (CantOpenFileFromUrlException $e) {
                dd($e);
            }
        }

        $userAccount = UserAccount::updateOrCreate([
            'id' => $socialUser->id,
            'provider' => $provider,
        ], [
            'user_id' => $user->id,
            'token' => $socialUser->token,
            'refresh_token' => $socialUser->refreshToken,
        ]);
//        $userAccount->refresh();

        //storage에 이미지가 없다면 db의 profile_photo_path도 null로 수정
        if (!Storage::disk('public')->exists($user->getAttribute('profile_photo_path'))) {
            $user->update(['profile_photo_path' => null]);
        }

        Auth::login($user);

        return redirect()->to('/');
    }


    public function logout($provider): \Illuminate\Http\RedirectResponse
    {
        $user = Auth::user();

        if($user) {
            $userAccount = $user->accounts()->where('provider', $provider)->first();

            if ($userAccount) {
                $accessToken = $userAccount->token;
                $response = Http::post('https://kapi.kakao.com/v1/user/logout', [], [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $accessToken,
                    ],
                ]);
                $userAccount->delete();
            }
            Auth::logout();
        }
        return redirect()->to('/');
    }

    private function getActionRand() : String {
        $words = [
            "인사하는",
            "하트뽀뽀",
            "점프하는",
            "달리는",
            "하늘 나는",
            "방방뛰는",
            "신나는",
            "즐거운",
            "슬픈",
            "질투하는",
            "사랑스런",
            "사랑하는",
            "폭 안기는",
            "예쁜",
            "조그마한",
        ];
        return array_rand($words);
    }
    private function getColorRand() : String {
        $words = [
            "빨간",
            "노란",
            "초록의",
            "파란",
            "푸른",
            "붉은",
            "어두운",
            "밝은",
            "까만",
            "하얀",
            "알록달록"
        ];
        return array_rand($words);
    }
    private function getStrRand() : String {
        $words = [
            "머리",
            "눈",
            "입술",
            "피부",
            "손톱",
            "네일",
        ];
        return array_rand($words);
    }
    private function getNameRand() : String {
        $words = [
            "사자", "물범", "표범", "호랑이", "캥거루", "코알라", "고니", "하마", "토끼", "쥐",
            "판다", "원숭이", "꿩", "말", "거북이", "얼룩말", "늑대", "침팬지", "낙타", "버팔로", "물소", "치타", "고양이", "악어", "암소", "고릴라", "기린","거위",
            "햄스터","수달","순록","물개","코뿔소","다람쥐","도마뱀","사슴","펭귄","딱따구리","앵무새","부엉이","고슴도치","여우","사막여우","개구리","두꺼비","타조",
            "당나귀","돼지","돌고래","상어","비둘기","염소","양","오리","닭","병아리","독수리","매","갈매기","백조","까치","까마귀","곰","하이에나","두더지","나무늘보","귀뚜라미","나비","나방",
            "달팽이","고래","북극곰","사마귀","스컹크","이구아나","퓨마","코끼리","파리","모기","오랑우탄","아나콘다","올챙이","박쥐","플라밍고"
        ];
        return array_rand($words);
    }
}