Laravel RestAPI 구현하기 (2) - Passport로 회원가입,로그인,로그아웃 구현
- 라라벨은 애플리케이션에 Full OAuth2 서버 구현을 제공하는 Passport를 사용하여 API 인증을 용이하게 합니다
- Laravel Passport를 사용하여 로그인,회원가입,로그아웃 관련 API를 만들어 보도록 합니다.
Laravel Passport 설치하기
- 아래의 명령어를 통하여 본인의 라라벨 프로젝트 내부에 passport를 설치해본다
# composer.json 및 composer.lock에 passport 추가
$ composer require laravel/passport
# passport의 oauth관련 db table 생성하기
$ php artisan migrate
# 보안강화를 위한 토큰 키 생성
$ php artisan passport:install
Passport 설정하기
- 사용자 관련 인증이기 때문에 User모델 내부에 Passort 관련 설정을 해줘야 합니다.
- app/Models/User.php 파일에 HasApiTokens 사용처리 해줘아 합니다.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens; // HasApiTokens 사용
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function orders()
{
// 한명의 고객은 여러 주문을 할 수 있다.
return $this->hasMany(Order::class);
}
}
- 다음으로 app/Providers/AuthServiceProvider.php 파일을 열구 boot()에 passport routes를 등록합니다.
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
- passportServiceProvider를 사용하기 위해 config/app.php에 등록해줍니다.
'providers' => [
...
...
...
Laravel\Passport\PassportServiceProvider::class,
],
- 마지막으로 config/auth.php로 들어가 guards의 api부분을 passport로 지정해 줍니다.
<?php
return [
....
....
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
....
....
]
PassportAuthController 만들기
- 로그인,회원가입,로그이웃 RestAPI 생성을 위한 새 컨트롤러를 생성합니다.
$ php artisan make:controller PassportAuthController
- 이곳에는 로그인,로그아웃,회원가입 기능만 구현 할 것이기 때문에 다른 API관련 코드는 따로 만드는걸 추천합니다.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
class PassportAuthController extends Controller
{
public function __construct()
{
/**
*
* success : 성공시 200 반환
* token : 성공시 토큰 값 반환
* error : 실패시 에러
* message : 에러 메시지 반환
*/
}
/**
* 회원가입 API
*/
public function register(Request $request)
{
$this->validate($request, [
'name' => 'required|min:4',
'email' => 'required|email',
'password' => 'required|min:8',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
]);
$token = $user->createToken('MingyuApp')->accessToken;
return response()->json(['token' => $token], 200);
}
/**
* 로그인
*/
public function login(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:8',
]);
$data = [
'email' => $request->email,
'password' => $request->password
];
if (auth()->attempt($data)) {
$token = auth()->user()->createToken('MingyuApp')->accessToken;
return response()->json(['token' => $token], 200);
} else {
return response()->json(['error' => 'Unauthorised'], 401);
}
}
public function logout(Request $request)
{
$result = $request->user()->token()->revoke();
if($result){
$response = response()->json(['error'=>false,'message'=>'User logout successfully.'],200);
}else{
$response = response()->json(['error'=>true,'message'=>'Something is wrong.'],401);
}
return $response;
}
}
API 경로 정의하기
- API 관련 경로는 web.php가 아닌, route/api.php 에 작성합니다.
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PassportAuthController;
use App\Http\Controllers\PostController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::post('v1/register', [PassportAuthController::class, 'register']);
Route::post('v1/login', [PassportAuthController::class, 'login']);
Route::middleware('auth:api')->group(function () {
Route::post('v1/logout', [PassportAuthController::class, 'logout']);
});
Laravel Passport API 테스트 - with Poastman
- 새로 형성된 엔드포인트를 테스트하기 위해 Postman을 사용합니다.
- https://www.postman.com/
회원가입 테스트
- 위에서 설정한 post('register')의 값과 동일하게 주소를 입력합니다.
- 필수 값( PassportAuthController 의 validation값 ) 을 form-data에 입력해 줍니다.
- header에는 accept를 apllication/json 으로 맞춰줍니다.
- send를 보내면 아래와 같이 token값을 리턴받는걸 확인 할 수 있습니다.
로그인 테스트
- 회원가입 테스트에서 이용한 아이디와 비밀번호를 form-data값으로 입력합니다.
- api.php에서 지정한 주소를 입력합니다.
- token값이 리턴되는 것을 확인합니다.
로그아웃 테스트
- 로그인 테스트에서 얻은 token값을 복사하여 Authorization의 Bearer Token값으로 넣어줍니다
- api.php에서 지정한 주소를 입력합니다.
- 반환값에 PassportAuthController.php에서 지정한 error가 false, message가 로그아웃 성공으로 나온다면 확인 완료
마무리
- 라라벨에서는 별도의 로그인 폼을 통한 사용자 인증을 손쉽게 사용 할 수 있는 방법이 있습니다.
- 하지만 RestAPI로 로그인,회원가입,로그아웃을 구현할 때는 Laravel Passport를 활용한다면 손 쉽게 구현이 가능합니다.
- Laravel Passport는 라라벨 애플리케이션에 Full Oauth2 서버 구현을 제공하여 API 인증을 용이하게 합니다.
관련글
'Laravel' 카테고리의 다른 글
Laravel로 만드는 Slack Bot (1) - slack app 만들기 및 초기설정 (0) | 2022.03.02 |
---|---|
Laravel RestAPI 구현하기 (3) - 상품조회,주문,주문조회 구현 (0) | 2022.03.02 |
Laravel RestAPI 구현하기 (1) - 모델링 (0) | 2022.02.28 |
Local 환경에서 개발 후, 서버 배포시 'Class Not Found' 오류 현상 (0) | 2022.02.08 |
What is Laravel EncryptCookies ???? (0) | 2020.05.26 |