Skip to content

Commit 587eaac

Browse files
committed
refactor(auth): simplify GitHub callback flow and deprecate connect callback route
1 parent 15ae5c1 commit 587eaac

3 files changed

Lines changed: 14 additions & 10 deletions

File tree

app/Http/Controllers/Auth/GitHubController.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@
99
use Illuminate\Http\RedirectResponse;
1010
use Illuminate\Support\Facades\Auth;
1111
use Laravel\Socialite\Facades\Socialite;
12+
use Laravel\Socialite\Two\GithubProvider;
1213
use Laravel\Socialite\Two\User as SocialiteUser;
1314
use Symfony\Component\HttpFoundation\RedirectResponse as SymfonyRedirectResponse;
1415

1516
class GitHubController extends Controller
1617
{
1718
public function redirect(): SymfonyRedirectResponse
1819
{
19-
/** @var \Laravel\Socialite\Two\GithubProvider $driver */
20+
/** @var GithubProvider $driver */
2021
$driver = Socialite::driver('github');
2122

2223
return $driver
@@ -26,6 +27,10 @@ public function redirect(): SymfonyRedirectResponse
2627

2728
public function callback(): RedirectResponse
2829
{
30+
if (session()->has('github_connect_organization') && Auth::check()) {
31+
return $this->connectCallback();
32+
}
33+
2934
try {
3035
/** @var SocialiteUser $githubUser */
3136
$githubUser = Socialite::driver('github')->user();
@@ -90,7 +95,7 @@ public function connect(Organization $organization): SymfonyRedirectResponse
9095
{
9196
session(['github_connect_organization' => $organization->slug]);
9297

93-
/** @var \Laravel\Socialite\Two\GithubProvider $driver */
98+
/** @var GithubProvider $driver */
9499
$driver = Socialite::driver('github');
95100

96101
return $driver

routes/web.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616

1717
Route::middleware('guest')->group(function () {
1818
Route::get('auth/github/redirect', [GitHubController::class, 'redirect'])->name('auth.github.redirect');
19-
Route::get('auth/github/callback', [GitHubController::class, 'callback'])->name('auth.github.callback');
2019
});
2120

21+
Route::get('auth/github/callback', [GitHubController::class, 'callback'])->name('auth.github.callback');
22+
2223
Route::middleware(['auth', 'verified'])->group(function () {
2324
Route::get('/', DashboardController::class)->name('dashboard');
2425

2526
// GitHub connect (elevated scopes for git credentials)
26-
Route::get('auth/github/connect/callback', [GitHubController::class, 'connectCallback'])->name('auth.github.connect.callback');
2727
Route::get('auth/github/connect/{organization:slug}', [GitHubController::class, 'connect'])->name('auth.github.connect');
2828

2929
// Organizations

tests/Feature/Auth/GitHubAuthenticationTest.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ function mockSocialiteRedirect(string $expectedUrl = 'https://github.com/login/o
252252

253253
$response = $this->actingAs($user)
254254
->withSession(['github_connect_organization' => $organization->slug])
255-
->get(route('auth.github.connect.callback'));
255+
->get(route('auth.github.callback'));
256256

257257
$response->assertRedirect(route('organizations.settings.git-credentials.index', $organization));
258258
$response->assertSessionHas('status', 'GitHub credentials connected successfully.');
@@ -283,23 +283,22 @@ function mockSocialiteRedirect(string $expectedUrl = 'https://github.com/login/o
283283

284284
$response = $this->actingAs($user)
285285
->withSession(['github_connect_organization' => $organization->slug])
286-
->get(route('auth.github.connect.callback'));
286+
->get(route('auth.github.callback'));
287287

288288
$response->assertRedirect(route('organizations.settings.git-credentials.index', $organization));
289289
$response->assertSessionHas('error');
290290

291291
expect(OrganizationGitCredential::where('organization_uuid', $organization->uuid)->count())->toBe(1);
292292
});
293293

294-
test('connect callback redirects to dashboard when no organization in session', function () {
294+
test('callback without connect session performs normal login', function () {
295295
$user = User::factory()->withGitHub()->create();
296296

297297
$socialiteUser = mockSocialiteUser(['id' => $user->github_id]);
298298
mockSocialiteCallback($socialiteUser);
299299

300-
$response = $this->actingAs($user)
301-
->get(route('auth.github.connect.callback'));
300+
$response = $this->get(route('auth.github.callback'));
302301

303302
$response->assertRedirect(route('dashboard'));
304-
$response->assertSessionHas('error');
303+
$this->assertAuthenticatedAs($user);
305304
});

0 commit comments

Comments
 (0)