GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GITHUB_CLIENT_REDIRECT=http:
and all your social client_id,secret,rediret define in .env file
Route::get('login/{driver}', 'Auth\LoginController@redirectToProvider')->name('social.oauth');
Route::get('login/{driver}/callback', 'Auth\LoginController@handleProviderCallback')->name('social.callback');
login.blade.php
<form method="POST" action="{{ route('login') }}">
@csrf
.
..
...
<a href="{{ route('social.oauth','github') }}" class="btn btn-info"> Github</a>
<a href="{{ route('social.oauth','facebook') }}" class="btn btn-info">facebook </a>
<a href="{{ route('social.oauth','twitter') }}" class="btn btn-info"> twitter</a>
<a href="{{ route('social.oauth','google') }}" class="btn btn-info"> google</a>
</form>
protected $providers = [ 'github','facebook','google','twitter' ];
public function redirectToProvider($driver)
{
if( ! $this->isProviderAllowed($driver) ) {
return $this->sendFailedResponse("{$driver} is not currently supported");
}
try {
return Socialite::driver($driver)->redirect();
} catch (Exception $e) {
// You should show something simple fail message
return $this->sendFailedResponse($e->getMessage());
}
}
public function handleProviderCallback( $driver )
{
try {
$user = Socialite::driver($driver)->user();
} catch (Exception $e) {
return $this->sendFailedResponse($e->getMessage());
}
// check for email in returned user
return empty( $user->email )
? $this->sendFailedResponse("No email id returned from {$driver} provider.")
: $this->loginOrCreateAccount($user, $driver);
}
protected function sendSuccessResponse()
{
return redirect()->intended($this->redirectTo());
}
protected function sendFailedResponse($msg = null)
{
toastr()->warning('Unable to login, try with another provider to login.');
return redirect()->route('login')
->withErrors(['msg' => $msg ?: 'Unable to login, try with another provider to login.']);
}
protected function loginOrCreateAccount($providerUser, $driver)
{
// check for already has account
$user = User::where('email', $providerUser->getEmail())->first();
// if user already found
if( $user ) {
// update the avatar and provider that might have changed
$user->update([
'avatar' => $providerUser->avatar,
'provider' => $driver,
'provider_id' => $providerUser->id,
'access_token' => $providerUser->token,
]);
} else {
// create a new user
$user = User::create([
'name' => $providerUser->getName(),
'email' => $providerUser->getEmail(),
'avatar' => $providerUser->getAvatar(),
'provider' => $driver,
'provider_id' => $providerUser->getId(),
'access_token' => $providerUser->token,
'email_verified_at' => now(),
// user can use reset password to create a password
'password' => ''
]);
}
// login the user
Auth::login($user, true);
return $this->sendSuccessResponse();
}
private function isProviderAllowed($driver)
{
return in_array($driver, $this->providers) && config()->has("services.{$driver}");
}