본문 바로가기
프로그래밍/Web

Laravel Jetstream Authentication

by 사악신 2024. 1. 6.

라라벨 제트스트림은 로그인, 이중 인증 로그인, 등록, 비밀번호 재설정, 이메일 인증 기능을 자동으로 구조화하여 프로젝트에 대해 제공합니다. 이를 통해 사용자 인증의 세부 사항에 대해 걱정하지 않고 중요하게 생각하는 기능을 구축하기 시작할 수 있습니다.

 

Laravel Fortify

내부적으로, 제트스트림의 인증 부분은 라라벨 포티파이(Laravel Fortify)에 의해 구동되며, 이는 라라벨을 위한 프론트엔드에 구애받지 않는 인증 백엔드입니다. 본질적으로, 포티파이는 애플리케이션의 인증 기능을 구현하기 위한 경로와 컨트롤러를 정의하는 반면, 제트스트림 UI는 그 경로로 요청을 보냅니다.

제트스트림이 설치되면, `config/fortify.php` 설정 파일이 애플리케이션에 설치됩니다. 이 설정 파일 내에서, 사용될 인증 가드, 인증 후 사용자가 리디렉션될 위치 등 포티파이의 동작과 관련된 다양한 측면을 사용자 정의할 수 있습니다.

포티파이 설정 파일 내에서는 프로필 정보나 비밀번호 업데이트와 같은 포티파이의 전체 기능을 비활성화할 수도 있습니다.

 

Views/Pages

Livewire 스택을 사용하는 경우, 로그인 뷰는 `resources/views/auth/login.blade.php` Blade 템플릿을 사용하여 표시됩니다. Inertia 스택을 사용하는 경우, 이 뷰는 `resources/js/Pages/Auth/Login.vue` 템플릿을 사용하여 표시됩니다. 이러한 뷰를 포함하는 디렉터리에는 애플리케이션의 다른 인증 관련 뷰/페이지도 포함되어 있습니다.

 

Customizing The Authentication Views

라라벨 제트스트림은 애플리케이션의 로그인 및 기타 인증 화면에 적절한 뷰를 자동으로 렌더링합니다. 그러나 때로는 특정 인증 뷰의 렌더링 방식이나 뷰에 전달되는 데이터를 사용자 정의하고 싶을 수 있습니다.

인증 뷰의 모든 렌더링 로직은 `Laravel\Fortify\Fortify` 클래스를 통해 사용 가능한 적절한 메소드를 사용하여 사용자 정의할 수 있습니다. 일반적으로 이 메소드는 애플리케이션의 `App\Providers\JetstreamServiceProvider` 클래스의 `boot` 메소드에서 호출해야 합니다:

 

use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::loginView(function () {
        return view('auth.login');
    });
}

 

Customizing Inertia Authentication Views
애플리케이션이 Inertia 스택을 사용하는 경우, 뷰 사용자 정의 클로저에서 Inertia 페이지를 반환할 수 있습니다:

 

use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
use Laravel\Fortify\Fortify;

Fortify::loginView(function () {
    return Inertia::render('Auth/Login', [
        'canResetPassword' => Route::has('password.request'),
        'status' => session('status'),
    ]);
});

 

Customizing The Authentication Process

Customizing User Authentication

때때로, 사용자 자격 증명이 어떻게 인증되는지와 사용자가 애플리케이션 데이터베이스에서 어떻게 검색되는지에 대한 전체적인 사용자 정의를 원할 수 있습니다. 다행히도, 제트스트림은 `Fortify::authenticateUsing` 메소드를 사용하여 이를 쉽게 달성할 수 있도록 합니다.

`authenticateUsing` 메소드는 들어오는 HTTP 요청을 받는 클로저를 허용합니다. 클로저는 요청에 첨부된 로그인 자격 증명을 검증하고 관련 사용자 인스턴스를 반환하는 책임이 있습니다. 자격 증명이 유효하지 않거나 사용자를 찾을 수 없는 경우, 클로저에 의해 null 또는 false가 반환되어야 합니다. 일반적으로 이 메소드는 `JetstreamServiceProvider`의 `boot` 메소드에서 호출해야 합니다:

 

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    // ...

    Fortify::authenticateUsing(function (Request $request) {
        $user = User::where('email', $request->email)->first();

        if ($user &&
            Hash::check($request->password, $user->password)) {
            return $user;
        }
    });
}

 

클로저 대신 클래스 내에 사용자 정의 인증 프로세스를 캡슐화하고 싶다면, `authenticateUsing` 메소드에 PHP "callable" 배열을 전달할 수 있습니다:

 

use App\Actions\AuthenticateLoginAttempt;
use Laravel\Fortify\Fortify;

Fortify::authenticateUsing([new AuthenticateLoginAttempt, '__invoke']);

 

Customizing The Authentication Pipeline

라라벨 포티파이(Laravel Fortify), 즉 제트스트림의 기본 인증 라이브러리는 호출 가능한 클래스의 파이프라인을 통해 로그인 요청을 인증합니다.

원한다면, 로그인 요청이 통과해야 할 사용자 정의 클래스 파이프라인을 정의할 수 있습니다. 각 클래스는 들어오는 `Illuminate\Http\Request` 인스턴스를 받고, 미들웨어처럼 다음 클래스로 요청을 전달하기 위해 호출되는 `$next` 변수를 갖는 `__invoke` 메소드를 가져야 합니다.

사용자 정의 파이프라인을 정의하려면, `Fortify::authenticateThrough` 메소드를 사용할 수 있습니다. 이 메소드는 로그인 요청을 통과시킬 클래스 배열을 반환해야 하는 클로저를 받습니다. 일반적으로 이 메소드는 애플리케이션의 `App\Providers\JetstreamServiceProvider` 클래스의 `boot` 메소드에서 호출해야 합니다.

아래 예제에는 사용자 정의 변경을 시작할 때 사용할 수 있는 기본 파이프라인 정의가 포함되어 있습니다:

 

use Laravel\Fortify\Actions\AttemptToAuthenticate;
use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;
use Laravel\Fortify\Actions\PrepareAuthenticatedSession;
use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;
use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;

Fortify::authenticateThrough(function (Request $request) {
    return array_filter([
            config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class,
            RedirectIfTwoFactorAuthenticatable::class,
            AttemptToAuthenticate::class,
            PrepareAuthenticatedSession::class,
    ]);
});

 

Password Reset

로그인/인증과 관련된 뷰와 액션을 구조화하는 것 외에도, 제트스트림은 사용자가 비밀번호를 잊어버렸을 경우 비밀번호를 재설정하기 위해 필요한 리소스도 구조화합니다. 물론, 이 기능은 라라벨의 기본 비밀번호 재설정 기능을 활용합니다.

 

비밀번호 재설정 기능을 사용하기 전에, 라라벨 애플리케이션이 이메일을 보낼 수 있도록 구성되어 있는지 확인해야 합니다. 그렇지 않으면, 라라벨은 애플리케이션 사용자에게 비밀번호 재설정 링크를 보낼 수 없습니다.

 

Actions

대부분의 제트스트림 기능과 마찬가지로, 비밀번호 재설정 요청을 충족하기 위해 실행되는 로직은 애플리케이션 내의 액션 클래스에서 찾을 수 있습니다. 액션은 제트스트림 또는 포티파이 기능과 관련된 단일 작업을 수행하는 세부적인 클래스라는 것을 기억하세요.

구체적으로, 사용자가 비밀번호를 재설정할 때 `App\Actions\Fortify\ResetUserPassword` 클래스가 호출됩니다. 이 액션은 사용자의 새 비밀번호를 검증하고 사용자 인스턴스의 비밀번호를 업데이트하는 책임이 있습니다. 따라서, 사용자 비밀번호 재설정 로직에 대해 하고자 하는 모든 사용자 정의는 이 클래스에서 이루어져야 합니다. 이 액션은 들어오는 요청의 모든 입력을 포함하는 $input 배열을 받습니다.

Password Validation Rules
`App\Actions\Fortify\CreateNewUser`, `App\Actions\Fortify\ResetUserPassword`, `App\Actions\Fortify\UpdateUserPassword` 액션은 모두 `App\Actions\Fortify\PasswordValidationRules` 트레이트를 사용합니다.

알 수 있듯이, `App\Actions\Fortify\PasswordValidationRules` 트레이트는 사용자 정의 `Laravel\Fortify\Rules\Password` 검증 규칙 객체를 사용합니다. 이 객체를 사용하면 애플리케이션의 비밀번호 요구 사항을 쉽게 사용자 정의할 수 있습니다. 기본적으로 이 규칙은 최소 8자의 비밀번호를 요구합니다. 그러나 다음 메소드를 사용하여 비밀번호 요구 사항을 사용자 정의할 수 있습니다:

use Laravel\Fortify\Rules\Password;

// Require at least 10 characters...
(new Password)->length(10)

// Require at least one uppercase character...
(new Password)->requireUppercase()

// Require at least one numeric character...
(new Password)->requireNumeric()

// Require at least one special character...
(new Password)->requireSpecialCharacter()

 

물론, 이 메소드들은 애플리케이션의 비밀번호 검증 규칙을 정의하기 위해 연쇄적으로 사용될 수 있습니다:

(new Password)->length(10)->requireSpecialCharacter()

 

View/Pages

제트스트림의 비밀번호 재설정 기능은 두 개의 화면을 사용하여 구현됩니다: 사용자가 비밀번호 재설정 링크를 요청할 수 있는 화면과 사용자가 실제로 비밀번호를 재설정할 수 있는 화면입니다.

비밀번호 재설정 링크 요청
Livewire 스택을 사용하는 경우, 비밀번호 재설정 링크 요청 뷰는 `resources/views/auth/forgot-password.blade.php` Blade 템플릿을 사용하여 표시됩니다. Inertia 스택을 사용하는 경우, 이 뷰는 `resources/js/Pages/Auth/ForgotPassword.vue` 템플릿을 사용하여 표시됩니다.

비밀번호 재설정
Livewire 스택을 사용하는 경우, 비밀번호 재설정 뷰는 `resources/views/auth/reset-password.blade.php` Blade 템플릿을 사용하여 표시됩니다. Inertia 스택을 사용하는 경우, 이 뷰는 `resources/js/Pages/Auth/ResetPassword.vue` 템플릿을 사용하여 표시됩니다.

 

반응형

'프로그래밍 > Web' 카테고리의 다른 글

Laravel Jetstream Profile Management  (0) 2024.01.06
Laravel Jetstream Registration  (1) 2024.01.06
Laravel Jetstream API  (0) 2024.01.06
Laravel Jetstream Teams  (0) 2024.01.06
Laravel Jetstream 시작하기  (0) 2023.12.27

댓글