Skip to content

Commit a01fa65

Browse files
committed
refactoring the auth flow
1 parent b710f0b commit a01fa65

15 files changed

+415
-369
lines changed

.github/workflows/tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
strategy:
1616
fail-fast: true
1717
matrix:
18-
php: [7.3, 7.4]
18+
php: [7.3, 7.4, 8.0]
1919
laravel: [^6.0, ^7.0, ^8.0]
2020
include:
2121
- laravel: ^6.0

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
}
1616
],
1717
"require": {
18-
"php": "^7.3",
18+
"php": "^7.3|^8.0",
1919
"ext-json": "*",
2020
"laravel/framework": "^6.0|^7.0|^8.0"
2121
},

resources/views/auth/passwords/reset.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<form method="POST" action="{{ route('canvas.password.update') }}" class="w-100 my-auto">
1111
@csrf
1212

13-
<input type="hidden" name="token" value="{{ $token }}">
13+
<input type="hidden" name="token" value="{{ $request->route('token') }}">
1414

1515
<div class="form-group row">
1616
<div class="col-12">

routes/web.php

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?php
22

3-
use Canvas\Http\Controllers\Auth\ForgotPasswordController;
4-
use Canvas\Http\Controllers\Auth\LoginController;
5-
use Canvas\Http\Controllers\Auth\ResetPasswordController;
3+
use Canvas\Http\Controllers\Auth\AuthenticatedSessionController;
4+
use Canvas\Http\Controllers\Auth\NewPasswordController;
5+
use Canvas\Http\Controllers\Auth\PasswordResetLinkController;
66
use Canvas\Http\Controllers\HomeController;
77
use Canvas\Http\Controllers\PostController;
88
use Canvas\Http\Controllers\SearchController;
@@ -17,19 +17,31 @@
1717

1818
// Authentication routes...
1919
Route::namespace('Auth')->group(function () {
20-
Route::prefix('login')->group(function () {
21-
Route::get('/', 'LoginController@showLoginForm')->name('canvas.login');
22-
Route::post('/', 'LoginController@login');
23-
});
20+
Route::get('login', [AuthenticatedSessionController::class, 'create'])
21+
->middleware('guest')
22+
->name('canvas.login');
2423

25-
Route::prefix('password')->group(function () {
26-
Route::get('reset', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('canvas.password.request');
27-
Route::post('email', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('canvas.password.email');
28-
Route::get('reset/{token}', [ResetPasswordController::class, 'showResetForm'])->name('canvas.password.reset');
29-
Route::post('reset', [ResetPasswordController::class, 'reset'])->name('canvas.password.update');
30-
});
24+
Route::post('login', [AuthenticatedSessionController::class, 'store'])
25+
->middleware('guest');
26+
27+
Route::get('forgot-password', [PasswordResetLinkController::class, 'create'])
28+
->middleware('guest')
29+
->name('canvas.password.request');
30+
31+
Route::post('forgot-password', [PasswordResetLinkController::class, 'store'])
32+
->middleware(['guest'])
33+
->name('canvas.password.email');
34+
35+
Route::get('reset-password/{token}', [NewPasswordController::class, 'create'])
36+
->middleware(['guest'])
37+
->name('canvas.password.reset');
38+
39+
Route::post('reset-password', [NewPasswordController::class, 'store'])
40+
->middleware(['guest'])
41+
->name('canvas.password.update');
3142

32-
Route::get('logout', [LoginController::class, 'logout'])->name('canvas.logout');
43+
Route::get('logout', [AuthenticatedSessionController::class, 'destroy'])
44+
->name('canvas.logout');
3345
});
3446

3547
// API routes...
@@ -89,5 +101,7 @@
89101
});
90102

91103
// Catch-all route...
92-
Route::get('/{view?}', [HomeController::class, 'index'])->where('view', '(.*)')->name('canvas');
104+
Route::get('/{view?}', [HomeController::class, 'index'])
105+
->where('view', '(.*)')
106+
->name('canvas');
93107
});
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
namespace Canvas\Http\Controllers\Auth;
4+
5+
use Illuminate\Contracts\Foundation\Application;
6+
use Illuminate\Contracts\View\Factory;
7+
use Illuminate\Contracts\View\View;
8+
use Illuminate\Http\RedirectResponse;
9+
use Illuminate\Routing\Controller;
10+
use Canvas\Http\Requests\LoginRequest;
11+
use Illuminate\Http\Request;
12+
use Illuminate\Support\Facades\Auth;
13+
use Illuminate\Validation\ValidationException;
14+
15+
class AuthenticatedSessionController extends Controller
16+
{
17+
/**
18+
* Display the login view.
19+
*
20+
* @return Application|Factory|View
21+
*/
22+
public function create()
23+
{
24+
return view('canvas::auth.login');
25+
}
26+
27+
/**
28+
* Handle an incoming authentication request.
29+
*
30+
* @param LoginRequest $request
31+
* @return RedirectResponse
32+
* @throws ValidationException
33+
*/
34+
public function store(LoginRequest $request)
35+
{
36+
$request->authenticate();
37+
38+
$request->session()->regenerate();
39+
40+
return redirect()->route('canvas');
41+
}
42+
43+
/**
44+
* Destroy an authenticated session.
45+
*
46+
* @param Request $request
47+
* @return RedirectResponse
48+
*/
49+
public function destroy(Request $request)
50+
{
51+
Auth::guard('canvas')->logout();
52+
53+
$request->session()->invalidate();
54+
55+
$request->session()->regenerateToken();
56+
57+
return redirect()->route('canvas.login');
58+
}
59+
}

src/Http/Controllers/Auth/LoginController.php

Lines changed: 0 additions & 147 deletions
This file was deleted.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace Canvas\Http\Controllers\Auth;
4+
5+
use Canvas\Models\User;
6+
use Exception;
7+
use Illuminate\Contracts\Foundation\Application;
8+
use Illuminate\Contracts\View\Factory;
9+
use Illuminate\Contracts\View\View;
10+
use Illuminate\Http\RedirectResponse;
11+
use Illuminate\Routing\Controller;
12+
use Illuminate\Http\Request;
13+
use Illuminate\Support\Facades\Auth;
14+
use Illuminate\Support\Facades\Hash;
15+
use Illuminate\Support\Str;
16+
use Throwable;
17+
18+
class NewPasswordController extends Controller
19+
{
20+
/**
21+
* Display the password reset view.
22+
*
23+
* @param Request $request
24+
* @return Application|Factory|View
25+
*/
26+
public function create(Request $request)
27+
{
28+
return view('canvas::auth.passwords.reset')->with([
29+
'request' => $request,
30+
]
31+
);
32+
}
33+
34+
/**
35+
* Handle an incoming new password request.
36+
*
37+
* @param Request $request
38+
* @return RedirectResponse
39+
*
40+
* @throws Exception
41+
*/
42+
public function store(Request $request)
43+
{
44+
$request->validate([
45+
'token' => 'required',
46+
'email' => 'required|email',
47+
'password' => 'required|confirmed|min:8',
48+
]);
49+
50+
try {
51+
52+
[$id, $token] = explode('|', decrypt($request->token));
53+
54+
$user = User::findOrFail($id);
55+
56+
// Here we will attempt to reset the user's password. If it is successful we
57+
// will update the password on an actual user model and persist it to the
58+
// database. Otherwise we will parse the error and return the response.
59+
$user->password = Hash::make($request->password);
60+
61+
$user->setRememberToken(Str::random(60));
62+
63+
$user->save();
64+
65+
Auth::guard('canvas')->login($user);
66+
} catch (Throwable $e) {
67+
return redirect()->route('canvas.password.request')->with('invalidResetToken', 'Invalid token');
68+
}
69+
70+
cache()->forget("password.reset.{$id}");
71+
72+
// If the password was successfully reset, we will redirect the user back to
73+
// the application's home authenticated view. If there is an error we can
74+
// redirect them back to where they came from with their error message.
75+
return redirect()->route('canvas');
76+
}
77+
}

0 commit comments

Comments
 (0)