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);
}
}