Technique/PHP

Laravel 6.x Passport 를 이용한 API인증

kaelina 2020. 1. 23. 13:12
반응형
기본적으로 레퍼런스 사이트에 나와있는 방법을 참고하였으며, 보면서 이해가 안되는 부분은 여기저기 검색해가면서 만든걸 바탕으로 작성합니다.

전재조건

  • 레퍼런스를 참고하여 coposer 를 이용한 어플리케이션 설치
  • 레퍼런스를 참고하여 기본 인증/마이그레이션에 성공
  • /register를 이용하여 1개 이상의 아카운트 작성을 마친 상태
  1. composer 를 이용하여 passport 를 도입

    composer require laravel/passport
  2. migrate 실행

    php artisan migrate
  3. HashApi trait를 추가
    app/User.php 파일에 아래이 내용을 추가

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use Notifiable;
    use HasApiTokens;
...
  1. Passport::routes 실행 및 Implicit Grant추가
    passport를 이용할 경우 기본적으로 제공하는 /oauth/token과 같은 경로를 활성화 하기 위해 프로바이더를 수정해야한다.
    app/Provider/AuthServiceProvider
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();

        Passport::enableImplicitGrant();
        // 아래 내용은 토크에 대한 유효기간 옵션
        // normal token expired
        Passport::tokensExpireIn(now()->addDay(15));

        // refresh token expired
        Passport::refreshTokensExpireIn(now()->addDay(30));

        // personal token expired
        Passport::personalAccessTokensExpireIn(now()->addMonth(6));
    }
  1. dirver 옵션 변경
    app/config/auth.php 에 guard.api 부분 driver 부분을 passport로 수정
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
            'hash' => true,
        ],
    ],
  1. 암호화 키 생성
    passport는 access_token을 생성하기 위해 storage/oauth-*.key 파일들을 사용한다.
    하지만 .gitignore 에서는 해당 파일들을 저장소에 올리지 못하게 블럭하고 있다. 때문에 본인의 프로젝트를 위한 암호화 키를 별도로 생성해야 한다. 이를 위해 passport에서는 3가지 방법을 제공하고 있다.
  • passport:keys => 암호화 키를 생성
  • passport:client => Personal Access Client , Passwrod Grant Client를 생성
  • passport:install => keys, client둘다

따라서 경우에 맞게 해주는게 좋으나 지금은 install을 해준다.

php artisan passport:install

해당 명령어를 입력했다면 mysql의 oauth_clients 테이블에는 아래와 같은 레코드가 생성되어 있다.

이를 확인 했다면 POSTMAN 과 같은 테스트 툴을 이용하여 실제로 로그인 인증을 해보자.

위에서의 설정을 통해 /oauth/tokens 패스가 이용가능하며 이곳에 POST로 데이터를 넘기는 것이 포인트
파라메터에 대해 이야기 하자면

  • grant_type : "passord" oauth_clients 테이블 의 password_client를 이용할 것이기에 password
  • client_id : 해당 레코드의 id는 2였기 에 2
  • client_secret : 해당 레코드의 값
  • username : register를 이용하여 생성한 유저의 메일 정보
  • password : register를 이용하여 생성한 유저의 패스워드

성공하면

와 같이 토큰이 돌아온다.

이를 사용하기 위해선

와 같이 Header에 Authorization 항목을 붙이고 위의 작업에서 받은 access_token을 사용하면 된다.

해당 API에서 인증을 사용하고 싶다면 route.php를 수정해야한다.

Route::middleware('auth:api')->get('/articles', 'ArticleController@index');

이위에 refresh토크을 사용하는 방법은 나도 아직 해보지 않아서 패스...ㅋㅋ route 테이블을 확인해보니
/oauth/tokens/refresh
패스가 있엇기 때문에 이걸 이용하면 되지 않을까?
그리고 password_client가 아닌 personal_access_client방식도 아직 안해봤다.. ㅋㅋ 당장은 쓸일이 없지 않을까..?ㅎ

반응형