print( sjw.iq == 200) output : true

[Laravel] Passport 사용하기 (oauth2.0, REST API) 본문

PHP

[Laravel] Passport 사용하기 (oauth2.0, REST API)

sjwiq200 2020. 2. 11. 23:30
728x90
반응형

저희 zzieut은 다른 oauth를 사용하는데요.

 

사용자 인증을 손쉽게 사용할 수 있는 Passport를 사용해보려고 합니다.

 

 

1. 컴포저를 통해 Passport 설치

composer require laravel/passport

# 시작하자마자.... 에러를...

# 저는 라라벨 프레임 워크 5.8.36 버전을 쓰고 있었는데 6버전이 필요하다고 나오네요!

 

 

오류를 해결하는 방법은 밑의 페이지에서 찾았습니다!

 

https://github.com/laravel/passport/issues/774

 

Your requirements could not be resolved to an installable set of packages · Issue #774 · laravel/passport

Problem 1 - Conclusion: don't install laravel/passport v6.0.6 - Conclusion: don't install laravel/passport v6.0.5 - Conclusion: don't install laravel/passport v6.0.4 - Conclusion: don&#...

github.com

 

다음과 같이 설치해주면 해결이 됩니다.

composer require paragonie/random_compat=~2.0
composer require laravel/passport=^7.0

 

 

####### 기본 Passport는 테이블 키값을 int로 지정합니다.

####### uuid로 지정하고 싶으시면 이전 글을 참조해주세요!

 

https://sjwiq200.tistory.com/63

 

[Laravel] laravel Passport oauth uuid 사용하기

Passport 관련 테이블을 int 가 아닌 uuid를 사용하는 방법에 대해서 포스팅하겠습니다. [oauth_auth_codes] - table

sjwiq200.tistory.com

 

 

 

2. Passport는 고유한 데이터베이스 마이그레이션을 등록하기 때문에, 마이그레이션을 실행해줍시다.

php artisan migrate

 

 

위의 이미지와 같이 oauth와 관련된 테이블들이 생깁니다.

 

 

3. 안전한 엑세스 토큰을 생성하는데 필요한 암호화 키를 생성합니다.

(이 명령어는 안전한 엑세스 토큰을 생성하는데 필요한 암호화 키를 생성합니다. 추가적으로, 명령어는 엑세스 토큰을 생성하는데 사용되는 "personal access" 그리고 "password grant" 클라이언트를 생성합니다.)

php artisan passport:install

 

다음과 같이 Client ID와 Client secret가 생성이 됩니다.

 

oauth_clients 테이블

 

oauth_personal_access_client 테이블

 

4. Users 모델을 다음과 같이 수정해줍니다.

# 저는 pk와 테이블명을 수정해주었습니다.

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    protected $table = 'users';
    protected $primaryKey = 'id';

    protected $fillable = [
        'id', 'name', 'password','state','created_at','updated_at'
    ];

    protected $hidden = [
        'password', 'remember_token'
    ];
    
    // 해당 값으로 passport username 적용
    public function findForPassport($id)
    {
        return $this->where('id', $id)->first();
    }

}

 

 

5.Passport::routes 실행 및 Implicit Grant추가 (app/Provider/AuthServiceProvider)
# passport를 이용할 경우 기본적으로 제공하는 /oauth/token과 같은 경로를 활성화 하기 위해 프로바이더를 수정해야한다.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
         'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();

		Passport::enableImplicitGrant();
        Passport::ignoreCsrfToken();

        // 토큰 유효기간
        Passport::tokensExpireIn(now()->addHours(12));

        // refresh token
        Passport::refreshTokensExpireIn(now()->addDays(60));

        // personalAccessToken
        Passport::personalAccessTokensExpireIn(now()->addHours(6));
        //
    }
}

 

6. config/auth.php  파일에서 api 인증 옵션을 passport로 변경

 

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
            'hash' => true,
        ],
    ],

 

7. API router를 만들어줍시다.

# token 값 확인을 위한 api 들은 middleware를 걸어줍시다!

Route::prefix('/auth')->group(function () {
    Route::post('login', 'AuthController@login');
    Route::post('signup', 'AuthController@signup');

    Route::middleware('auth:api')->group(function() {
        Route::get('logout', 'AuthController@logout');
        Route::get('user', 'AuthController@user');
    });
});

 

 

8. Controller 추가

<?php
/**
 * Created by IntelliJ IDEA.
 * User: zzim
 * Date: 22/01/2020
 * Time: 2:56 PM
 */

namespace App\Http\Controllers;

use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Auth;
use Validator;

class AuthController extends BaseController
{

    /**
     * Create user
     *
     * @param  [string] name
     * @param  [string] email
     * @param  [string] password
     * @param  [string] password_confirmation
     * @return [string] message
     */
    public function signup(Request $request)
    {
        $request->validate([
            'user_id' => 'required|string',
            'site_no' => 'required|int',
            'password' => 'required|string'
        ]);

        $now = date('Y-m-d H:i:s');
        $user = new User([
        	'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
            'state'=>1,
            'created_at' => $now,
            'updated_at' => $now
        ]);
        $user->save();
        return response()->json([
            'message' => 'Successfully created user!'
        ], 200);
    }

    /**
     * Login user and create token
     *
     * @param  [string] email
     * @param  [string] password
     * @param  [boolean] remember_me
     * @return [string] access_token
     * @return [string] token_type
     * @return [string] expires_at
     */
    public function login(Request $request)
    {
        $request->validate([
            'user_id' => 'required|string',
            'password' => 'required|string'
        ]);
        return $this->createToken($request->user_id, $request->password);
       
    }
    
    public function createToken ($userId, $password) {
        $credentials = array(
            'email' => $userId,
            'password' => $password
        );

        if (!Auth::attempt($credentials)) {
            return 'login fail';
        }

        $data = [
            'grant_type' => 'password',
            'client_id' => '2',
            'client_secret' => 'M4t3qokY6IcAiMdHFqq5gxGeuklxHgPYvX8KF78Y',
            'username' => Auth::user()['id'],
            'password' => $password,
            'scope' => '*',
        ];
        $request = Request::create('/oauth/token', 'POST', $data);
        $response = app()->handle($request);

        return $response;
    }

    /**
     * Logout user (Revoke the token)
     *
     * @return [string] message
     */
    public function logout(Request $request)
    {
        $request->user()->token()->revoke();
        return response()->json([
            'message' => 'Successfully logged out'
        ]);
    }

    /**
     * Get the authenticated User
     *
     * @return [json] user object
     */
    public function user(Request $request)
    {
        return response()->json($request->user());
    }
}

 

회원가입을 먼저 진행한 후에~~

다음과 같이 로그인을 진행해주시면 됩니다.

 

 

로그인 API

 

 

 

추가적으로 타사에서 찌읏의 API를 쓸 떄는 client를 생성해줘야 하는 부분인데요!

해당 내용은 다음 기회에 포스팅하러 오겠습니다~!

 

 

참고: https://laravel.kr/docs/5.8/passport

 

라라벨 5.8 - Passport-OAuth2

라라벨 한글 메뉴얼 5.8 - Passport-OAuth2

laravel.kr

https://medium.com/modulr/create-api-authentication-with-passport-of-laravel-5-6-1dc2d400a7f

 

Create API Rest with Laravel 5.6 Passport Authentication (Part 1)

We learning to create a authentication system with API Laravel Authentication Passport OAuth

medium.com

 

728x90
반응형
Comments