Technique/PHP
Laravel 6.x Passport 를 이용한 API인증
kaelina
2020. 1. 23. 13:12
반응형
기본적으로 레퍼런스 사이트에 나와있는 방법을 참고하였으며, 보면서 이해가 안되는 부분은 여기저기 검색해가면서 만든걸 바탕으로 작성합니다.
- 참고 https://laravel.kr/docs/6.x/passport
- 참고 https://laravel.kr/docs/6.x/authentication
- 참고 https://laravel.kr/docs/6.x/api-authentication
전재조건
- 레퍼런스를 참고하여 coposer 를 이용한 어플리케이션 설치
- 레퍼런스를 참고하여 기본 인증/마이그레이션에 성공
- /register를 이용하여 1개 이상의 아카운트 작성을 마친 상태
composer 를 이용하여 passport 를 도입
composer require laravel/passport
migrate 실행
php artisan migrate
HashApi trait를 추가
app/User.php 파일에 아래이 내용을 추가
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use Notifiable;
use HasApiTokens;
...
- 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));
}
- dirver 옵션 변경
app/config/auth.php 에 guard.api 부분 driver 부분을 passport로 수정
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => true,
],
],
- 암호화 키 생성
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방식도 아직 안해봤다.. ㅋㅋ 당장은 쓸일이 없지 않을까..?ㅎ
반응형