Skip to content

Commit e31d771

Browse files
committed
use fortify for email only mode and provide templates for basic login and confirm password.
1 parent ab3ff00 commit e31d771

File tree

11 files changed

+70
-42
lines changed

11 files changed

+70
-42
lines changed

config/multi-factor.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@
2525
'setup' => MultiFactorSetupViewResponse::class,
2626
],
2727
'templates' => [
28-
'login' => 'auth.login',
2928
'confirm-password' => 'auth.confirm-password',
30-
'totp-challenge' => 'auth.two-factor-challenge',
3129
],
3230
],
3331

resources/lang/en/button.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55
'disable' => 'Disable',
66
'login' => 'Login',
77
'resend_mfa' => 'Resend :authenticationMethod',
8+
'continue' => 'Continue',
89
];
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<x-multi-factor::layout>
2+
<x-slot name="title">@lang('multi-factor::auth.email_login.title')</x-slot>
3+
4+
<x-multi-factor::auth-card>
5+
<x-multi-factor::form :action="route('password.confirm')">
6+
<x-multi-factor::form.input field="password" label="Password" type="password" required autofocus/>
7+
8+
<div>
9+
<label for="remember_me">
10+
<input id="remember_me" type="checkbox" name="remember">
11+
<span>@lang('multi-factor::auth.remember_me')</span>
12+
</label>
13+
</div>
14+
15+
<div class="mfa-row mfa-flex-end">
16+
<x-multi-factor::button type="submit">
17+
@lang('multi-factor::button.login')
18+
</x-multi-factor::button>
19+
</div>
20+
</x-multi-factor::form>
21+
</x-multi-factor::auth-card>
22+
</x-multi-factor::layout>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<x-multi-factor::layout>
2+
<x-slot name="title">@lang('multi-factor::auth.email_login.title')</x-slot>
3+
4+
<x-multi-factor::auth-card>
5+
<x-multi-factor::form :action="route('login.store')">
6+
<x-multi-factor::form.input field="email" label="E-Mail Address" type="email" required autofocus/>
7+
<x-multi-factor::form.input field="password" label="Password" type="password" required autofocus/>
8+
9+
<div>
10+
<label for="remember_me">
11+
<input id="remember_me" type="checkbox" name="remember">
12+
<span>@lang('multi-factor::auth.remember_me')</span>
13+
</label>
14+
</div>
15+
16+
<div class="mfa-row mfa-flex-end">
17+
<x-multi-factor::button type="submit">
18+
@lang('multi-factor::button.login')
19+
</x-multi-factor::button>
20+
</div>
21+
</x-multi-factor::form>
22+
</x-multi-factor::auth-card>
23+
</x-multi-factor::layout>

resources/views/pages/totp-setup.blade.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</x-multi-factor::button>
1111
</x-multi-factor::form>
1212

13-
@if(session('auth.password_confirmed_at'))
13+
@if(session('auth.password_confirmed_at') && !$user->hasTotpConfirmed())
1414
<script>
1515
document.addEventListener('DOMContentLoaded', () => {
1616
document.getElementById('fortify-totp')?.submit();
@@ -36,7 +36,7 @@
3636
3737
<div class="mfa-width-full" style="margin-top: 20px;">
3838
<a href="{{ route('mfa.method', $mfaMethod) }}">
39-
<x-multi-factor::button type="button" class="mfa-width-full">Continue</x-multi-factor::button>
39+
<x-multi-factor::button type="button" class="mfa-width-full">@lang('multi-factor::button.continue')</x-multi-factor::button>
4040
</a>
4141
<div class="mfa-row" style="margin: 20px 0;">
4242
<span class="mfa-separator"></span>

src/Http/Controllers/MultiFactorAuthController.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class MultiFactorAuthController extends Controller
2828
public function show(): mixed
2929
{
3030
$user = MFA::getUser();
31-
$userMethods = $user->getUserMethods();
31+
$availableMethods = $user->getUserMethods() ?: MFA::getAllowedMethods();
3232

3333
if (MultiFactorAuthMode::isForceMode()) {
3434
$forceMethod = MFA::getForceMethod();
@@ -38,11 +38,11 @@ public function show(): mixed
3838
}
3939
}
4040

41-
if (count($userMethods) === 1) {
42-
return Redirect::route('mfa.method', ['method' => Arr::first($userMethods)]);
41+
if (count($availableMethods) === 1) {
42+
return Redirect::route('mfa.method', ['method' => Arr::first($availableMethods)]);
4343
}
4444

45-
return app(MultiFactorChooseViewResponseContract::class, $userMethods ?: MFA::getAllowedMethods());
45+
return app(MultiFactorChooseViewResponseContract::class, $availableMethods);
4646
}
4747

4848
public function handleMultiFactorAuthMethod(MultiFactorAuthMethod $method): MultiFactorChallengeViewResponseContract
@@ -62,7 +62,9 @@ public function setup(MultiFactorAuthMethod $method = null): RedirectResponse|Mu
6262
$methods = $method?->isAllowed() ? [$method] : MFA::getAllowedMethods();
6363

6464
if ($method) {
65-
return $method->getHandler()->showSetup();
65+
if (!(MultiFactorAuthMode::isForceMode() && !$method->isForceMethod())) {
66+
return $method->getHandler()->showSetup();
67+
}
6668
}
6769

6870
if (MultiFactorAuthMode::isForceMode()) {
@@ -93,6 +95,11 @@ public function authenticateByEmailOnly(Request $request): RedirectResponse
9395

9496
MFA::setLoginIdAndRemember($user, $request->boolean('remember'));
9597

98+
if (!MultiFactorAuthMethod::EMAIL->isUserMethod() && !$user->getMultiFactorAuthMethods()) {
99+
MFA::setVerified();
100+
MFA::setSetupAfterLogin();
101+
}
102+
96103
return redirect()->route('mfa.show');
97104
}
98105

src/Http/Middleware/EnforceEmailOnlyLogin.php

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/Http/Middleware/RedirectIfMultiFactorAuthenticated.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Closure;
66
use Cybex\LaravelMultiFactor\Enums\MultiFactorAuthMode;
77
use Illuminate\Http\Request;
8+
use Illuminate\Support\Facades\Auth;
89
use Symfony\Component\HttpFoundation\Response;
910
use MFA;
1011

@@ -17,7 +18,7 @@ class RedirectIfMultiFactorAuthenticated
1718
*/
1819
public function handle(Request $request, Closure $next): Response
1920
{
20-
if (MFA::isVerified() && MultiFactorAuthMode::isForceMode() && $request->route('method')?->isUserMethod()) {
21+
if (Auth::check() && MFA::isVerified() && MultiFactorAuthMode::isForceMode() && $request->route('method')?->isUserMethod()) {
2122
return redirect()->intended();
2223
}
2324

src/Http/Responses/MultiFactorLoginViewResponse.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
namespace Cybex\LaravelMultiFactor\Http\Responses;
44

55
use Cybex\LaravelMultiFactor\Contracts\MultiFactorLoginViewResponseContract;
6-
use Illuminate\Contracts\View\Factory;
7-
use Illuminate\Contracts\View\View;
8-
use Illuminate\Foundation\Application;
6+
use MFA;
97

108
class MultiFactorLoginViewResponse implements MultiFactorLoginViewResponseContract
119
{
1210
public function toResponse($request)
1311
{
14-
return view('laravel-multi-factor::pages.email-login');
12+
if (MFA::isEmailOnlyLoginActive()) {
13+
return view('laravel-multi-factor::pages.email-login');
14+
} else {
15+
return view('laravel-multi-factor::auth.login');
16+
}
1517
}
1618
}

src/MultiFactorServiceProvider.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use Cybex\LaravelMultiFactor\Exceptions\LoginRouteNotFoundException;
1515
use Cybex\LaravelMultiFactor\Facades\MFA;
1616
use Cybex\LaravelMultiFactor\Helpers\MFAHelper;
17-
use Cybex\LaravelMultiFactor\Http\Middleware\EnforceEmailOnlyLogin;
1817
use Cybex\LaravelMultiFactor\Http\Middleware\HasAllowedMultiFactorAuthMethods;
1918
use Cybex\LaravelMultiFactor\Http\Middleware\HasLoginId;
2019
use Cybex\LaravelMultiFactor\Http\Middleware\HasMultiFactorAuthentication;
@@ -35,7 +34,6 @@
3534
use Illuminate\Foundation\AliasLoader;
3635
use Illuminate\Support\Facades\Blade;
3736
use Illuminate\Support\Facades\Event;
38-
use Illuminate\Support\Facades\Route;
3937
use Illuminate\Support\ServiceProvider;
4038
use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;
4139
use Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse;
@@ -49,7 +47,6 @@ public function boot(): void
4947
/*
5048
* Optional methods to load your package assets
5149
*/
52-
5350
$this->mergeConfigFrom(__DIR__ . '/../config/multi-factor.php', 'multi-factor');
5451
$this->loadTranslationsFrom(__DIR__ . '/../resources/lang', 'multi-factor');
5552
$this->loadViewsFrom(__DIR__ . '/../resources/views', 'laravel-multi-factor');
@@ -61,7 +58,6 @@ public function boot(): void
6158
$router->aliasMiddleware('hasAllowedMultiFactorAuthMethods', HasAllowedMultiFactorAuthMethods::class);
6259
$router->aliasMiddleware('redirectIfMultiFactorAuthenticated', RedirectIfMultiFactorAuthenticated::class);
6360
$router->aliasMiddleware('limitMultiFactorAuthAccess', LimitMultiFactorAuthAccess::class);
64-
$router->aliasMiddleware('enforceEmailOnlyLogin', EnforceEmailOnlyLogin::class);
6561
$router->aliasMiddleware('hasLoginId', HasLoginId::class);
6662
$router->aliasMiddleware('tempLoginForMFA', TempLoginForMfa::class);
6763

@@ -108,16 +104,10 @@ public function boot(): void
108104
FailedMultiFactorLoginResponse::class
109105
);
110106

111-
$routes = Route::getRoutes();
112-
$routes->refreshNameLookups();
113-
$loginRoute = $routes->getByName('login');
114-
115107
if (MFA::isEmailOnlyLoginActive()) {
116108
if (!MultiFactorAuthMode::isForceMode() || MFA::getForceMethod() !== MultiFactorAuthMethod::EMAIL) {
117109
throw new InvalidEmailOnlyLoginConfigurationException();
118110
}
119-
120-
$loginRoute->middleware('enforceEmailOnlyLogin');
121111
}
122112

123113
require 'routes/overrides.php';

0 commit comments

Comments
 (0)