SocialiteController.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace App\Http\Controllers\Auth;
  3. use App\Facades\Settings;
  4. use App\Http\Controllers\Controller;
  5. use App\Models\User;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Carbon;
  8. use Illuminate\Support\Facades\Auth;
  9. use Illuminate\Support\Str;
  10. use Laravel\Socialite\Facades\Socialite;
  11. class SocialiteController extends Controller
  12. {
  13. /**
  14. * Redirect to the provider's authentication url
  15. *
  16. * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Illuminate\Http\RedirectResponse
  17. */
  18. public function redirect(Request $request, string $driver)
  19. {
  20. if (! config('services.' . $driver . '.client_id') || ! config('services.' . $driver . '.client_secret')) {
  21. return redirect('/error?err=sso_bad_provider_setup');
  22. }
  23. return Settings::get('enableSso')
  24. ? Socialite::driver($driver)->redirect()
  25. : redirect('/error?err=sso_disabled');
  26. }
  27. /**
  28. * Register (if needed) the user and authenticate him
  29. *
  30. * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
  31. */
  32. public function callback(Request $request, string $driver)
  33. {
  34. try {
  35. $socialiteUser = Socialite::driver($driver)->user();
  36. } catch (\Exception $e) {
  37. return redirect('/error?err=sso_failed');
  38. }
  39. $uniqueName = $socialiteUser->getId() . '@' . $driver;
  40. $socialiteEmail = $socialiteUser->getEmail() ?? $uniqueName;
  41. $socialiteName = ($socialiteUser->getNickname() ?? $socialiteUser->getName()) . ' (' . $uniqueName . ')';
  42. /** @var User|null $user */
  43. $user = User::firstOrNew([
  44. 'oauth_id' => $socialiteUser->getId(),
  45. 'oauth_provider' => $driver,
  46. ]);
  47. if (! $user->exists) {
  48. if (User::where('email', $socialiteEmail)->exists()) {
  49. return redirect('/error?err=sso_email_already_used');
  50. } elseif (User::count() === 0) {
  51. $user->is_admin = true;
  52. } elseif (Settings::get('disableRegistration')) {
  53. return redirect('/error?err=sso_no_register');
  54. }
  55. $user->password = bcrypt(Str::random());
  56. }
  57. $user->email = $socialiteEmail;
  58. $user->name = $socialiteName;
  59. $user->last_seen_at = Carbon::now()->format('Y-m-d H:i:s');
  60. $user->save();
  61. Auth::guard()->login($user);
  62. return redirect('/accounts');
  63. }
  64. }