라라벨 인증 종합 가이드

게시 됨: 2023-03-23

인증은 웹 애플리케이션의 가장 중요하고 필수적인 기능 중 하나입니다. Laravel과 같은 웹 프레임워크는 사용자가 인증할 수 있는 다양한 방법을 제공합니다.

Laravel 인증 기능을 빠르고 안전하게 구현할 수 있습니다. 그러나 이러한 인증 기능을 잘못 구현하면 악의적인 당사자가 이를 악용할 수 있으므로 위험할 수 있습니다.

이 가이드는 선택한 Laravel 인증 방법을 시작하기 위해 알아야 할 모든 것을 알려줍니다.

읽어!

Laravel 인증 소개

Laravel은 "guards"와 "providers"로 구성된 모듈을 소개합니다. 가드는 각 요청에 대한 사용자 인증을 정의하고 공급자는 영구 저장소(예: MySQL 데이터베이스)에서 사용자 검색을 정의합니다.

config/auth.php 파일에 인증 매개변수를 정의합니다. Laravel의 인증 동작을 조정하고 수정하는 여러 옵션이 포함되어 있습니다.

먼저 인증 기본값을 정의해야 합니다. 이 옵션은 애플리케이션의 기본 인증 "가드" 및 암호 재설정 옵션을 제어합니다. 필요에 따라 이러한 기본값을 변경할 수 있지만 대부분의 응용 프로그램에 대한 완벽한 시작입니다.

다음으로 애플리케이션에 대한 인증 가드를 정의합니다. 여기에서 기본 구성은 세션 저장소와 Eloquent 사용자 공급자를 사용합니다. 모든 인증 드라이버에는 사용자 공급자가 있습니다.

 return [ /* Defining Authentication Defaults */ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], /* Defining Authentication Guards Supported: "session" */ 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], ], /* Defining User Providers Supported: "database", "eloquent" */ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], /* Defining Password Resetting */ 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], /* Defining Password Confirmation Timeout */ 'password_timeout' => 10800, ];

나중에 모든 인증 드라이버에 사용자 공급자가 있는지 확인합니다. 이는 사용자 데이터를 유지하기 위해 데이터베이스 또는 기타 스토리지 메커니즘에서 사용자를 검색하는 방법을 정의합니다. 여러 사용자 테이블이나 모델이 있는 경우 각 모델이나 테이블을 나타내는 여러 소스를 구성할 수 있습니다. 이러한 소스는 정의한 추가 인증 가드에 할당될 수 있습니다.

사용자는 암호를 재설정할 수도 있습니다. 이를 위해 애플리케이션에 둘 이상의 사용자 테이블 또는 모델이 있고 특정 사용자 유형에 따라 별도의 설정을 원하는 경우 여러 암호 재설정 구성을 지정할 수 있습니다. 만료 시간은 각 재설정 토큰이 유효한 분 수입니다. 이 보안 기능은 토큰의 수명을 짧게 유지하므로 추측할 시간이 줄어듭니다. 필요에 따라 변경할 수 있습니다.

궁극적으로 암호 확인 시간이 초과되기 전에 시간을 정의해야 하며 확인 화면을 통해 사용자에게 암호를 다시 입력하라는 메시지가 표시됩니다. 기본적으로 제한 시간은 3시간 동안 지속됩니다.

Laravel 인증 방법의 유형

모든 시나리오를 인증하는 완벽한 방법은 없지만 이를 알고 있으면 더 나은 결정을 내리는 데 도움이 됩니다. 이것이 라라벨 9의 새로운 기능과 함께 라라벨이 어떻게 진화하고 있는지입니다. 이것은 인증 모드를 전환할 때 개발자로서 우리의 작업을 훨씬 더 쉽게 만듭니다.

암호 기반 인증

사용자를 인증하는 기초적인 방법으로 여전히 수천 개의 조직에서 사용되고 있지만 현재 개발을 고려하면 확실히 구식이 되어가고 있습니다.

공급업체는 최종 사용자의 마찰을 최소화하면서 복잡한 암호 구현을 시행해야 합니다.

그것은 매우 간단하게 작동하고 사용자는 이름과 암호를 입력하고 데이터베이스에서 이 둘 사이에 일치하는 항목이 있으면 서버는 요청을 인증하고 사용자가 미리 정의된 시간 동안 리소스에 액세스할 수 있도록 결정합니다.

토큰 기반 인증

이 방법론은 확인 시 사용자에게 고유한 토큰이 발급되는 경우에 사용됩니다.

이 토큰이 있으면 이제 사용자는 관련 리소스에 액세스할 수 있습니다. 권한은 토큰이 만료될 때까지 활성화됩니다.

토큰이 활성화되어 있는 동안 사용자는 사용자 이름이나 비밀번호를 사용할 필요가 없지만 새 토큰을 검색할 때 이 두 가지가 필요합니다.

토큰은 모든 인증 데이터를 포함하는 상태 비저장 엔터티이므로 오늘날 여러 시나리오에서 광범위하게 사용됩니다.

토큰 생성과 토큰 확인을 분리하는 방법을 제공하면 공급업체에 많은 유연성이 제공됩니다.

다단계 인증

이름에서 알 수 있듯이 최소 2개의 인증 요소를 사용하여 제공하는 보안 수준을 높입니다.

두 가지 요소만 포함하는 이중 요소 인증과 달리 이 방법에는 두 가지, 세 가지, 네 가지 등이 포함될 수 있습니다.

이 방법의 일반적인 구현은 암호를 사용하는 것과 관련이 있으며 그 후에 사용자는 스마트폰으로 인증 코드를 받습니다. 이 방법을 구현하는 공급업체는 빠르게 확장하는 동안 큰 문제가 될 수 있는 오탐지 및 네트워크 중단을 찾아야 합니다.

Laravel 인증을 구현하는 방법

이 섹션에서는 애플리케이션 사용자를 인증하는 여러 가지 방법을 알려줍니다. Jetstream, Breeze 및 Socialite와 같은 일부 라이브러리에는 사용 방법에 대한 무료 자습서가 있습니다.

수동 인증

사용자 등록부터 시작하여 routes/web.php 에서 필요한 경로를 생성합니다 .

우리는 두 가지 경로를 생성할 것입니다. 하나는 양식을 보는 것이고 다른 하나는 등록하는 것입니다.

 use App\Http\Contrllers\Auth\RegisterController; use Illuminate\Support\Facades\Route; /* Web Routes Register web routes for your app's RouteServiceProvider in a group containing the "web" middleware */ Route::get('/register', [RegisterController::class], 'create']); Route::post('/register', [RegisterController::class], 'store']);

그리고 다음에 필요한 컨트롤러를 만듭니다.

 php artisan make controller Auth/RegisterController -r

이제 다음과 같이 코드를 업데이트합니다.

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use illuminate\Htpp\Request; class RegisterController extends Controller { public function create() { return view('auth.register'); } public function store(Request $request) { } }

컨트롤러는 현재 비어 있으며 등록할 뷰를 반환합니다. resources/views/auth 에서 해당 보기를 만들고 그것을 register.blade.php 라고 부르겠습니다.

사용자 등록을 위한 라라벨 블레이드 뷰.
사용자 등록을 위한 라라벨 블레이드 뷰.

이제 모든 것이 준비되었으므로 /register 경로를 방문하여 다음 형식을 확인해야 합니다.

 public function store(Request $request) { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials, $request->filled('remember'))) { $request->session()->regenerate(); return redirect()->intended('/'); } return back()->withErrors([ 'email' => 'The provided credentials do not match our records.', ]); }

이제 사용자가 완료할 수 있는 양식을 표시하고 데이터를 가져올 수 있으므로 사용자의 데이터를 가져와 유효성을 검사한 다음 모든 것이 정상이면 데이터베이스에 저장해야 합니다. 여기에서 데이터베이스 트랜잭션을 사용하여 삽입한 데이터가 완전한지 확인해야 합니다.

Laravel의 요청 검증 기능을 사용하여 세 가지 자격 증명이 모두 필요한지 확인합니다. 이메일이 이메일 형식인지, users 테이블에서 고유한지, 비밀번호가 확인되었고 최소 8자인지 확인해야 합니다.

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; class RegisterController extends Controller { public function store(Request $request) { /* Validation */ $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|confirmed|min:8', ]); /* Database Insert */ $user = User:;create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return back(); } public function create() { return view('auth.register'); } }

이제 입력이 검증되었으므로 검증에 위배되는 모든 항목은 다음 형식으로 표시되는 오류를 발생시킵니다.

등록을 위한 잘못된 입력의 예
등록을 위한 잘못된 입력의 예

store 메서드에서 사용자 계정을 만들었다고 가정하고 사용자도 로그인하려고 합니다. 우리가 할 수 있는 두 가지 방법이 있습니다. 수동으로 수행하거나 Auth 파사드를 사용할 수 있습니다.

사용자가 로그인한 후에는 등록 화면으로 돌아가지 않고 대시보드나 홈페이지와 같은 새 페이지로 되돌려야 합니다. 이것이 우리가 여기서 할 일입니다.

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; class RegisterController extends Controller { public function store(Request $request) { /* Validation */ $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|confirmed|min:8', ]); /* Database Insert */ $user = User:;create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); Auth::login($user): return redirect(RouteServiceProvider::HOME); } public function create() { return view('auth.register'); } }

이제 사용자를 등록하고 로그인했으므로 -n 이 안전하게 로그아웃할 수 있는지 확인해야 합니다.

Laravel은 세션을 무효화하고 로그아웃 후 보안을 위해 토큰을 재생성할 것을 제안합니다. 이것이 바로 우리가 하려는 일입니다. LogoutController의 destroy 메소드를 사용하여 새로운 /logout 경로를 생성하는 것으로 시작합니다.

 use App\Http\Controllers\Auth\RegisterController; use App\Http\Controllers\Auth\LogoutController; use Illuminate\Support\Facades\Route; /* Web Routes Here is where you can register web routes for your application. These routes are loaded by the RrouteServiceProvider with a group which contains the "web" middleware group. Now create something great! */ Route::get('/register', [RegisterController::class, 'create']); Route::post('/register', ['RegisterController::class, 'store']); Route::post('/logout', [Logoutcontroller::class, 'destroy']) ->middleware('auth');

"auth" 미들웨어를 통해 로그아웃을 전달하는 것은 매우 중요합니다. 사용자가 로그인하지 않은 경우 경로에 액세스할 수 없어야 합니다.

이제 이전과 마찬가지로 컨트롤러를 만듭니다.

 php artisan make:controller Auth/LogoutController -r

우리는 요청을 destroy 메소드의 매개변수로 받는지 확인할 수 있습니다. Auth 파사드를 통해 사용자를 로그아웃하고 세션을 무효화하고 토큰을 재생성한 다음 사용자를 홈페이지로 리디렉션합니다.

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class LogoutController extends Controller { public function destroy(Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); } }

사용자 기억

전부는 아니지만 대부분의 최신 웹 애플리케이션은 로그인 양식에 "기억하기" 확인란을 제공합니다.

"기억하기" 기능을 제공하려면 시도 메서드의 두 번째 인수로 부울 값을 전달할 수 있습니다.

유효한 경우 Laravel은 사용자 인증을 무기한으로 또는 수동으로 로그아웃할 때까지 유지합니다. 사용자 테이블에는 문자열 remember_token (이것이 우리가 토큰을 재생성하는 이유입니다) 열을 포함해야 합니다. 여기서 "remember me" 토큰을 저장할 것입니다.

사용자를 위한 기본 마이그레이션에는 이미 포함되어 있습니다.

먼저 나를 기억하기 필드를 양식에 추가해야 합니다.

나를 기억해 필드 양식
나를 기억하는 필드를 추가합니다.

그런 다음 요청에서 자격 증명을 가져와 Auth 파사드의 시도 메서드에서 사용합니다.

사용자를 기억해야 하는 경우 로그인하고 홈페이지로 리디렉션합니다. 그렇지 않으면 오류가 발생합니다.

 public function store(Request $request) { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials, $request->filled('remember'))) { $request->session()->regenerate(); return redirect()->intended('/'); } return back()->withErrors([ 'email' =>

비밀번호 재설정

오늘날 대부분의 웹 애플리케이션은 사용자가 비밀번호를 재설정할 수 있는 방법을 제공합니다.

우리는 잊어버린 암호에 대한 또 다른 경로를 만들고 우리가 했던 것처럼 컨트롤러를 생성할 것입니다. 또한 전체 프로세스에 대한 토큰이 포함된 비밀번호 재설정 링크에 대한 경로를 추가합니다.

 Route::post('/forgot-password', [ForgotPasswordLinkController::class, 'store']); Route::post('/forgot-password/{token}', [ForgotPasswordController::class, 'reset']);

store 메서드 내에서 우리는 요청에서 이메일을 가져와 우리가 했던 것처럼 유효성을 검사합니다.

그런 다음 암호 파사드에서 sendResetLink 메서드를 사용할 수 있습니다.

그런 다음 응답으로 링크 전송에 성공한 경우 상태를 반환하고 그렇지 않은 경우 오류를 반환하려고 합니다.

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Password; class ForgotPasswordLinkController extends Controller { public function store(Request $request) { $request->validate([ 'email' => 'required|email', ]); $status = Password::sendResetLink( $request->only('email'); ); return $status === Password::RESET_LINK_SENT ? back()->with('status', __($status)) : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]); } }

이제 재설정 링크가 사용자의 이메일로 전송되었으므로 그 이후에 발생하는 로직을 처리해야 합니다.

요청에서 토큰, 이메일 및 새 암호를 받고 유효성을 검사합니다.

그런 다음 암호 파사드의 재설정 메소드를 사용하여 라라벨이 배후에서 다른 모든 것을 처리하도록 할 수 있습니다.

암호를 안전하게 유지하기 위해 항상 암호를 해시할 것입니다.

마지막으로 비밀번호가 재설정되었는지 확인하고 재설정된 경우 성공 메시지와 함께 사용자를 로그인 화면으로 리디렉션합니다. 그렇지 않으면 재설정할 수 없다는 오류가 표시됩니다.

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Password; use Illuminate\Support\Str; class ForgotPasswordController extends Controller { public function store(Request $request) { $request->validate([ 'token' => 'required', 'email' => 'required|email', 'password' => 'required|string|confirmed|min:8', ]); $status = Password::reset( $request->only('email', 'password', 'password_confirmation', 'token'), function ($user) use ($request) { $user->forceFill( 'password' => Hash::make($request->password), 'remember_token' => Str::random(60) ])->save(); } ); return $status == Password::PASSWORD_RESET ? redirect()->route('login')->with('status', __($status)) : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]); } }

라라벨 브리즈

Laravel Breeze는 로그인, 등록, 암호 재설정, 이메일 확인 및 암호 확인과 같은 Laravel 인증 기능을 간단하게 구현한 것입니다. 이를 사용하여 새 Laravel 애플리케이션에서 인증을 구현할 수 있습니다.

설치 및 설정

Laravel 애플리케이션을 생성한 후 데이터베이스를 구성하고, 마이그레이션을 실행하고, composer를 통해 laravel/breeze 패키지를 설치하기만 하면 됩니다.

 composer require laravel/breeze –dev

그런 다음 다음을 실행하십시오.

 php artisan breeze:install

인증 보기, 경로, 컨트롤러 및 사용하는 기타 리소스를 게시합니다. 이 단계 후에는 Breeze가 제공하는 모든 것을 완벽하게 제어할 수 있습니다.

이제 애플리케이션을 프런트엔드로 렌더링해야 하므로 JS 종속성(@vite 사용)을 설치합니다.

 npm install

:

 npm run dev

그런 다음 로그인 및 등록 링크가 홈페이지에 있어야 하며 모든 것이 원활하게 작동해야 합니다.

라라벨 제트스트림

Laravel Jetstream은 유용한 기능 및 기타 프런트엔드 스택으로 Laravel Breeze를 확장합니다.

로그인, 등록, 이메일 인증, 2단계 인증, 세션 관리, Sanctum을 통한 API 지원 및 선택적 팀 관리를 제공합니다.

Jetstream을 설치할 때 프런트엔드에서 Livewire와 Inertia 중에서 선택해야 합니다. 백엔드에서는 Laravel을 위한 "헤드리스" 인증 백엔드이며 프론트엔드에 구애받지 않는 Laravel Fortify를 사용합니다.

설치 및 설정

Laravel 프로젝트에서 작곡가를 통해 설치합니다.

 composer require laravel/jetstream

그런 다음 [stack] 인수 Livewire 또는 Inertia 를 허용하는 php artisan jetstream:install [stack] [stack] 을 실행합니다. –team 옵션을 전달하여 팀 기능을 활성화할 수 있습니다.

테스트를 위해 Pest PHP도 설치합니다.

마지막으로 다음을 사용하여 애플리케이션의 프런트엔드를 렌더링해야 합니다.

 npm install npm run dev

라라벨 포티파이

Laravel Fortify는 프론트엔드에 구애받지 않는 백엔드 인증 구현입니다. Laravel의 인증 기능을 구현하기 위해 Laravel Fortify를 사용할 필요가 없습니다.

Breeze 및 Jetstream과 같은 스타터 키트에도 사용됩니다. 백엔드 구현에 불과한 Fortify 독립 실행형을 사용할 수도 있습니다. 독립 실행형으로 사용하는 경우 프런트엔드는 Fortify 경로를 호출해야 합니다.

설치 및 설정

Composer를 통해 Fortify를 설치할 수 있습니다.

 composer require laravel/fortify

이제 Fortify의 리소스를 게시해야 합니다.

 php artisan vendor:publish –provider="Laravel\Fortify\FortifyServiceProvider"

그런 다음 새 FortifyServiceProvider , 구성 파일 및 데이터베이스 마이그레이션 외에도 새 app/Actions 디렉터리를 생성합니다.

마지막으로 다음을 실행합니다.

 php artisan migrate

또는:

 php artisan migrate:fresh

이제 Fortify를 사용할 준비가 되었습니다.

라라벨 소셜라이트

Laravel에는 간단한 OAuth 기반 사용자 인증 기능이 포함되어 있습니다. Facebook, Twitter, LinkedIn, Google, Bitbucket, GitHub 및 GitLab을 통한 소셜 로그인을 지원합니다.

설치

작곡가를 통해 설치할 수 있습니다.

 composer require laravel/socialite

설정 및 사용

설치한 후에는 응용 프로그램에서 사용하는 OAuth 공급자에 대한 자격 증명을 추가해야 합니다. 각 서비스에 대해 config/services.php 에 추가합니다.

구성에서 키를 이전 서비스와 일치시켜야 합니다. 이러한 키 중 일부는 다음과 같습니다.

  • 페이스북
  • 트위터(OAuth 1.0용)
  • twitter-oauth-2(OAuth 2.0용)
  • 링크드인
  • Google
  • 깃허브
  • 깃랩
  • 비트버킷

하나의 서비스 구성은 다음과 같습니다.

 'google' => [ 'client_id' => env("GOOGLE_CLIENT_ID"), 'client_secret' => env("GOOGLE_CLIENT_SECRET"), 'redirect' => "http://example.com/callback-url", ],

사용자 인증

이 작업에는 두 개의 경로가 필요합니다. 하나는 사용자를 OAuth 공급자로 리디렉션하는 것입니다.

 use Laravel\Socialite\Facades\Sociliate; Route::get('/auth/redirect', function () { return Socialite:;driver('google')->redirect(); });

그리고 인증 후 공급자의 콜백에 대한 것입니다.

 use Laravel\Socialite\Facades\Socialite; Route:;get('/auht/callback', function () { $user = Socialite:;driver('google')->user(); // Getting the user data $user->token; });

Socialite는 리디렉션 방법을 제공하고 파사드는 사용자를 OAuth 공급자로 리디렉션하는 반면 사용자 방법은 들어오는 요청을 검사하고 사용자 정보를 검색합니다.

사용자를 수신한 후 데이터베이스에 존재하는지 확인하고 인증해야 합니다. 존재하지 않는 경우 사용자를 나타내는 새 레코드를 만듭니다.

 use App\Models\User; use Illuminate\Support\Facades\Auth; use Laravel\Socialite\Facades\Socialite; Route::get('/auth/callback', function () { /* Get the user */ $googleUser = Socialite::driver('google')->user(); /* Create the user if it does not exist Update the user if it exists Check for google_id in database */ $user = User::updateOrCreate([ 'google_id' => $googleUser->id, ], [ 'name' => $googleUser->name, 'email' => $googleUser->email, 'google_token' => $googleUser->token, 'google_refresh_token' => $googleUser->refreshToken, ]); /* Authenticates the user using the Auth facade */ Auth::login($user); return redirect('/dashboard'); });

사용자의 액세스 범위를 제한하려는 경우 인증 요청에 포함할 scopes 메서드를 사용할 수 있습니다. 그러면 이전에 지정된 모든 범위가 지정된 범위와 병합됩니다.

이에 대한 대안은 다른 모든 기존 범위를 덮어쓰는 setScopes 메서드를 사용하는 것입니다.

 use Laravel\Socialite\Facades\Socialite; return Socialite::driver('google') ->scopes(['read:user', 'write:user', 'public_repo']) ->redirect(); return Socialite::driver('google') ->setScopes(['read:user', 'public_repo') ->redirect();

콜백 이후에 사용자를 얻는 방법과 모든 것을 알았으니 여기서 얻을 수 있는 데이터 중 일부를 살펴보겠습니다.

OAuth1 사용자는 tokentokenSecret 가지고 있습니다.

 $user = Socialite::driver('google')->user(); $token = $user->token; $tokenSecret = $user->tokenSecret;

OAuth2는 token , refreshTokenexpiresIn 제공합니다.

 $user = Socialite::driver('google')->user(); $token = $user->token; $refreshToken = $user->refreshToken; $expiresIn = $user->expiresIn;

OAuth1과 OAuth2 모두 getId , getNickname , getName , getEmailgetAvatar 제공합니다.

 $user = Socialite::driver('google')->user(); $user->getId(); $user->getNickName(); $user->getName(); $user->getEmail(); $user->getAvatar();

그리고 토큰(OAuth 2) 또는 토큰 및 암호(OAuth 1)에서 사용자 세부 정보를 가져오려는 경우 sanctum은 이를 위해 userFromTokenuserFromTokenAndSecret 두 가지 방법을 제공합니다.

 use Laravel\Socialite\Facades\Socialite; $user = Socialite:;driver('google')->userFromToken($token); $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);

라라벨 생텀

Laravel Sanctum은 SPA(Single Page Applications) 및 모바일 앱을 위한 가벼운 인증 시스템입니다. 이를 통해 사용자는 특정 범위의 여러 API 토큰을 생성할 수 있습니다. 이러한 범위는 토큰으로 허용되는 작업을 지정합니다.

용도

Sanctum은 복잡한 OAuth 없이 사용자에게 API 토큰을 발급하는 데 사용할 수 있습니다. 이러한 토큰은 일반적으로 몇 년과 같이 만료 시간이 길지만 사용자가 언제든지 취소하고 다시 생성할 수 있습니다.

설치 및 설정

작곡가를 통해 설치할 수 있습니다.

 composer require laravel/sanctum

그리고 구성 및 마이그레이션 파일을 게시해야 합니다.

 php artisan vendor:publish –provider="Laravel\Sanctum\SanctumServiceProvider"

이제 새 마이그레이션 파일을 생성했으므로 마이그레이션해야 합니다.

 php artisan migrate </code> or <code> php artisan migrate:fresh

API 토큰 발행 방법

토큰을 발행하기 전에 사용자 모델은 Laravel\Sanctum\HasApiTokens 특성을 사용해야 합니다.

 use Laravel\Sanctum\HasApiTokens; class User extends Authenticable { use HasApiTokens; }

사용자가 있으면 Laravel\Sanctum\NewAccessToken 인스턴스를 반환하는 createToken 메소드를 호출하여 토큰을 발행할 수 있습니다.

NewAccessToken 인스턴스에서 plainTextToken 메서드를 호출하여 토큰의 SHA-256 일반 텍스트 값을 볼 수 있습니다.

라라벨 인증을 위한 팁과 모범 사례

다른 장치에서 세션 무효화

이전에 논의한 것처럼 세션 무효화는 사용자가 로그아웃할 때 매우 중요하지만 모든 소유 장치에 대한 옵션으로도 사용할 수 있어야 합니다.

이 기능은 일반적으로 사용자가 암호를 변경하거나 업데이트할 때 사용되며 다른 장치에서 해당 세션을 무효화하려고 합니다.

Auth 파사드와 함께 제공되는 이것은 달성하기 쉬운 작업입니다. 우리가 사용하고 있는 경로에 authauth.session middleware 있다는 점을 고려하면 파사드의 logoutOtherDevices 정적 메서드를 사용할 수 있습니다.

 Route::get('/logout', [LogoutController::class, 'invoke']) ->middleware(['auth', 'auth.session']);
 use Illuminate\Support\Facades\Auth; Auth::logoutOtherDevices($password);

Auth::routes()를 사용한 구성

Auth 파사드의 라우트 메소드는 사용자 인증에 필요한 모든 라우트를 생성하는 헬퍼일 뿐입니다.

경로에는 로그인(Get, Post), 로그아웃(Post), 등록(Get, Post) 및 비밀번호 재설정/이메일(Get, Post)이 포함됩니다.

파사드에서 메소드를 호출할 때 다음을 수행합니다.

 public static fucntion routes(array $options = []) { if (!static::$app->providerIsLoaded(UiServiceProvider::class)) { throw new RuntimeException('In order to use the Auth:;routes() method, please install the laravel/ui package.'); } static::$app->make('router')->auth($options); }

정적 메서드가 라우터에서 호출될 때 발생하는 일에 관심이 있습니다. 파사드가 작동하는 방식 때문에 까다로울 수 있지만 다음 메서드는 다음과 같습니다.

 /** Register the typical authentication routes for an application. @param array $options @return void */ public function auth(array $options = []) { // Authentication Routes... $this->get('login', 'Auth\[email protected]')->name('login'); $this->post('login', 'Auth\[email protected]'); $this->post('logout', 'Auth\[email protected]')->name('logout'); // Registration Routes... if ($options['register'] ?? true) { $this->get('register', 'Auth\[email protected]')->name('register'); $this->post('register', 'Auth\[email protected]'); } // Password Reset Routes... if ($options['reset'] ?? true) { $this->resetPassword(); } // Email Verification Routes... if ($options['verify'] ?? false) { $this->emailVerification(); } }

기본적으로 이메일 확인 이외의 모든 경로를 생성합니다. 우리는 항상 로그인 및 로그아웃 경로를 가지지만 다른 경로는 옵션 배열을 통해 제어할 수 있습니다.

로그인/로그아웃 및 등록만 하려면 다음 옵션 배열을 전달할 수 있습니다.

 $options = ["register" => true, "reset" => false, "verify" => false];

경로 및 사용자 지정 가드 보호

일부 라우트는 인증된 사용자만 액세스할 수 있고 Route 파사드에 미들웨어 메소드를 호출하거나 미들웨어 메소드를 체이닝하여 신속하게 수행할 수 있기를 원합니다.

 Route::middleware('auth')->get('/user', function (Request $request) { return $request->user(); }); Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth');

이 가드는 들어오는 요청이 인증되었는지 확인합니다.

비밀번호 확인

웹 사이트 보안을 강화하기 위해 다른 작업을 진행하기 전에 사용자의 암호를 확인하려는 경우가 많습니다.

요청을 처리하려면 비밀번호 확인 보기에서 경로를 정의해야 합니다. 사용자를 확인하고 의도한 목적지로 리디렉션합니다. 동시에 세션에서 비밀번호가 확인된 것으로 표시되는지 확인합니다. 기본적으로 비밀번호는 3시간마다 재확인해야 하지만 config/auth.php 의 구성 파일에서 변경할 수 있습니다.

 use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Redirect; Route::post('/confirm-password', function (Request $request) { if (!Hash::check($request->password, $request->user()->password)) { return back()->withErrors([ 'password' => ['The provided password does not match our records.'] ]); } $request->session()->passwordConfirmed(); return redirect()->intended(); })->middleware(['auth']);

인증 가능한 계약

Illuminate\Contracts\Auth에 있는 Authenticable 계약은 UserProvider 파사드가 구현해야 하는 청사진을 정의합니다.

 namespace Illuminate\Contracts\Auth; interface Authenticable { public function getAuthIdentifierName(); public function getAuthIdentifier(); public function getAuthPassord(); public function getRememberToken(); public function setRememberToken($value); public function getrememberTokenName(); }

인터페이스를 통해 인증 시스템은 이를 구현하는 모든 "사용자" 클래스와 함께 작동할 수 있습니다.

이는 사용되는 ORM 또는 스토리지 계층에 관계없이 유지됩니다. 기본적으로 Laravel에는 이 인터페이스를 구현하는 App\Models\User가 있으며 이는 구성 파일에서도 볼 수 있습니다.

 return [ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], ], ];

인증 이벤트

전체 인증 프로세스 중에 전달되는 많은 이벤트가 있습니다.

목표에 따라 해당 이벤트에 리스너를 연결할 수 있습니다. EventServiceProvider .

라라벨 리스너
인증 서비스를 위해 생성된 Laravel 리스너 목록

신규 사용자를 빠르게 생성

App\User 를 통해 새 사용자를 빠르게 생성할 수 있습니다.

 $user = new App\User(); $user->password = Hash::make('strong_password'); $user->email = '[email protected]'; $user->name = 'Username'; $user->save();

또는 User 파사드의 정적 생성 메소드를 통해:

 User::create([ 'password' => Hash::make('strong-password'), 'email' => '[email protected]', 'name' => 'username' ]);

요약

Laravel 에코시스템에는 Breeze 및 Jetstream과 같은 인증 시스템으로 앱을 시작하고 실행할 수 있는 많은 스타터 키트가 있습니다. 코드가 우리 측에서 생성되기 때문에 고도로 사용자 정의할 수 있으며 필요한 경우 청사진으로 사용하여 원하는 만큼 수정할 수 있습니다.

인증 및 그 복잡성과 관련하여 많은 보안 문제가 있지만 이러한 모든 문제는 Laravel이 제공하는 도구를 통해 쉽게 해결할 수 있습니다. 이러한 도구는 사용자 정의가 가능하고 사용하기 쉽습니다.

빠른 Laravel 호스팅 서비스를 사용하여 Laravel 앱을 빠르고 효율적으로 배포하십시오. 무료 평가판을 통해 앱이 작동하는 모습을 확인하세요.