2020-05-20
네이버의 OAuth는 laravel 에서 기본적으로 지원하지 않는다.
하지만, 방식은 이전에 포스팅한 google과 비슷하기 때문에, google OAuth 인증을 참고 해서 작업을 하면 된다.
링크: http://b1ix.net/405

일단 네이버 OAuth뿐만 아니라 각종 소셜 로그인 관련 설명이 나와 있는 링크는 아래를 참고 하면 된다.
링크: https://socialiteproviders.netlify.app/providers/naver.html

자 그럼 이제 본격적으로 네이버 OAuth 인증을 시작해 보자.
google 인증과 다른 부분만 자세히 설명하고, 나머지 부분은 간단한 설명만 써놓을 예정이다

socialiteproviders/naver 설치
$composer require socialiteproviders/naver

config\app.php
- providers설정
- google OAuth를 작업하며 설정한 부분이 있으면 반드시 주석처리를 해야 오류가 안뜬다
'providers' => [
	...
	// 주석처리
	// Laravel\Socialite\SocialiteServiceProvider,
	\SocialiteProviders\Manager\ServiceProvider::class, // add
];

app\Providers\EventServiceProvider.php
- Event Listener 추가 - $listen부분에 아래 구문을 추가 한다

protected $listen = [
	...
	\SocialiteProviders\Manager\SocialiteWasCalled::class => [
		// add your listeners (aka providers) here
		'SocialiteProviders\\Naver\\NaverExtendSocialite@handle',
	],
];

위 부분 이외의 부분은 google OAuth와 동일하게 하면 된다.
- .env파일에 naver에서 받은 인증키와 비밀키, callback경로를 설정한다
- config\services.php파일에 위의 인증키, 비밀키, callback경로를 추가한다
- migration으로 users테이블에 naver_id 컬럼을 추가한다
- app/User.php의 $fillable 에 'naver_id' 추가한다
- routes/web.php에 naver로그인 관련 route를 추가한다
- app/Http/Controllers/Auth/LoginController.php에 관련 함수를 정의해 준다

config\services.php
'naver' => [
	'client_id' => env('NAVER_CLIENT_ID'),
	'client_secret' => env('NAVER_CLIENT_SECRET'),
	'redirect' => env('NAVER_CLIENT_REDIRECT'),
],
migration 파일
public function up()
{
	//
	Schema::table('users', function ($table) {
		$table->string('google_id', 100)->nullable();
		$table->string('naver_id', 100)->nullable();
	});
}
app/User.php
    protected $fillable = [
	'name', 'email', 'password', 'google_id', 'naver_id'
];
routes/web.php
Route::get('auth/naver', 'Auth\LoginController@redirectToProviderNaver');
Route::get('auth/naver/callback', 'Auth\LoginController@handleProviderCallbackNaver');
app/Http/Controllers/Auth/LoginController.php
public function redirectToProviderNaver()
{
	return Socialite::driver('naver')->redirect();
}


public function handleProviderCallbackNaver()
{
	$user = Socialite::driver('naver')->user();

	// 이미 있는 이메일일 경우 기존 이메일정보에 포함시켜 주는 부분
	$chk_email = User::where('email', $user->email)->first();
	if($chk_email){
		User::where('email', $user->email)->update(array('naver_id'=> $user->id));
		Auth::login($chk_email);
		return redirect('/home');
	}

	$finduser = User::where('naver_id', $user->id)->first();

	if($finduser){
		Auth::login($finduser);
		return redirect('/home');
	}else{
		$newUser = User::create([
			'name' => $user->name,
			'email' => $user->email,
			'naver_id'=> $user->id,
			'password'=> bcrypt('123456789')
		]);

		Auth::login($newUser);
		return redirect('/home');
	}
}