Skip to content

Commit

Permalink
Merge pull request #99 from geozhur/fix-login-github
Browse files Browse the repository at this point in the history
add restore for github login
  • Loading branch information
fey committed Nov 22, 2019
2 parents 3ec9a69 + e231df1 commit 7d2d80d
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 4 deletions.
3 changes: 3 additions & 0 deletions .codeclimate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ plugins:
standard: "./phpcs.xml"
sonar-php:
enabled: true
checks:
php:S1192:
enabled: false
tests_patterns:
- tests/**
phpmd:
Expand Down
53 changes: 49 additions & 4 deletions app/Http/Controllers/Auth/Social/GithubController.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Session;
use Socialite;
use Validator;
use Exception;

class GithubController extends Controller
{
Expand All @@ -24,20 +26,49 @@ public function __construct(Socialite $socialite, User $user)
*/
public function redirectToProvider()
{
return $this->socialite::driver('github')->scopes(['user:email'])->redirect();
try {
return $this->socialite::driver('github')->scopes(['user:email'])->redirect();
} catch (Exception $e) {
return $this->sendFailedResponse($e->getMessage());
}
}

/**
* Obtain the user information from GitHub.
*/
public function handleProviderCallback()
{
$socialiteUser = $this->socialite::driver('github')->user();
try {
$socialiteUser = $this->socialite::driver('github')->user();
} catch (Exception $e) {
return $this->sendFailedResponse($e->getMessage());
}

$email = $socialiteUser->getEmail();
$name = $socialiteUser->getName();

$userForAuth = User::firstOrNew(['email' => $socialiteUser->getEmail()]);
$validator = $this->validator(['email' => $email, 'name' => $name]);

if ($validator->fails()) {
return $this->sendFailedResponse();
}

return $this->loginOrCreateAccount($name, $email);
}

protected function loginOrCreateAccount($name, $email)
{
$userForAuth = User::firstOrNew(['email' => $email]);

if (false === $userForAuth->exists) {
$userForAuth->name = $socialiteUser->getName();
$deleteUser = User::withTrashed()->where('email', $email)->first();

if ($deleteUser) {
$deleteUser->restore();
return redirect()->route('my');
}

$userForAuth->name = $name;
$userForAuth->email_verified_at = now();
$userForAuth->password = Hash::make(random_bytes(10));
$userForAuth->saveOrFail();
Expand All @@ -48,4 +79,18 @@ public function handleProviderCallback()

return redirect()->route('my');
}

protected function sendFailedResponse($msg = null)
{
flash()->error($msg ?: __('auth.provider_fails'));
return redirect()->route('my');
}

protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'min:2','max:255'],
'email' => ['required', 'string', 'email', 'max:255'],
]);
}
}
1 change: 1 addition & 0 deletions resources/lang/en/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@
'send_link' => 'A link has been sent to your email to confirm registration',
'verified' => 'Email Confirmed',
],
'provider_fails' => 'Unable to login, try with another provider to login.',
];
1 change: 1 addition & 0 deletions resources/lang/ru/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@
'send_link' => 'На вашу электронную почту отправлена ссылка для подтверждения регистрации',
'verified' => 'Электронная почта подтверждена',
],
'provider_fails' => 'Ошибка авторизации или регистрации. Поробуйте другой тип',
];
35 changes: 35 additions & 0 deletions tests/Feature/Http/Controllers/GithubControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,39 @@ public function testCreateUserAndLogin()
$user = AppUser::where('email', $email)->firstOrFail();
$this->assertDatabaseHas('users', ['email' => $email]);
}

public function testUserDeleteAndLogin()
{
$name = $this->faker->name;
$token = $this->faker->randomAscii;
$email = $this->faker->email;
$this->mockSocialiteFacade($email, $name, $token, random_int(1, 100));
$this->json('GET', '/oauth/github/callback')->assertLocation(route('my'));

$user = AppUser::where('email', $email)->firstOrFail();
$this->assertDatabaseHas('users', ['email' => $email]);

$response = $this->delete(route('account.destroy', $user));
$response->assertStatus(302);

$user2 = AppUser::find($user->id);
$this->assertNull($user2);

$this->mockSocialiteFacade($email, $name, $token, random_int(1, 100));
$this->json('GET', '/oauth/github/callback')->assertLocation(route('my'));

$user = AppUser::where('email', $email)->firstOrFail();
$this->assertDatabaseHas('users', ['email' => $email]);
}

public function testCreateEmptyUserNameAndLogin()
{
$name = "";
$token = $this->faker->randomAscii;
$email = $this->faker->email;
$this->mockSocialiteFacade($email, $name, $token, random_int(1, 100));
$this->json('GET', '/oauth/github/callback')->assertLocation(route('my'));

$this->assertDatabaseMissing('users', [ 'email' => $email, 'name' => $name ]);
}
}

0 comments on commit 7d2d80d

Please sign in to comment.