Laravel RestAPI 구현하기 (2) - 회원가입,로그인,로그아웃 구현

 

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 API Platform | Sign Up for Free

Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.

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 인증을 용이하게 합니다.

 

관련글