네이버의 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');
}
}