일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ubuntu
- python
- MacOS
- AWS
- alb
- Android
- mac
- nginx
- Vue
- Prometheus
- Passport
- flutter
- FCM
- php
- selenium
- window
- node
- 해시키
- 안드로이드
- Vue.js
- OAuth
- 파이썬
- pip
- MYSQL
- Cordova
- SSH
- PostgreSQL
- Laravel
- 구글 API
- https
- Today
- Total
print( sjw.iq == 200) output : true
[Laravel] Passport 사용하기 (oauth2.0, REST API) 본문
저희 zzieut은 다른 oauth를 사용하는데요.
사용자 인증을 손쉽게 사용할 수 있는 Passport를 사용해보려고 합니다.
1. 컴포저를 통해 Passport 설치
composer require laravel/passport
# 시작하자마자.... 에러를...
# 저는 라라벨 프레임 워크 5.8.36 버전을 쓰고 있었는데 6버전이 필요하다고 나오네요!
오류를 해결하는 방법은 밑의 페이지에서 찾았습니다!
https://github.com/laravel/passport/issues/774
다음과 같이 설치해주면 해결이 됩니다.
composer require paragonie/random_compat=~2.0
composer require laravel/passport=^7.0
####### 기본 Passport는 테이블 키값을 int로 지정합니다.
####### uuid로 지정하고 싶으시면 이전 글을 참조해주세요!
https://sjwiq200.tistory.com/63
2. Passport는 고유한 데이터베이스 마이그레이션을 등록하기 때문에, 마이그레이션을 실행해줍시다.
php artisan migrate
위의 이미지와 같이 oauth와 관련된 테이블들이 생깁니다.
3. 안전한 엑세스 토큰을 생성하는데 필요한 암호화 키를 생성합니다.
(이 명령어는 안전한 엑세스 토큰을 생성하는데 필요한 암호화 키를 생성합니다. 추가적으로, 명령어는 엑세스 토큰을 생성하는데 사용되는 "personal access" 그리고 "password grant" 클라이언트를 생성합니다.)
php artisan passport:install
다음과 같이 Client ID와 Client secret가 생성이 됩니다.
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를 쓸 떄는 client를 생성해줘야 하는 부분인데요!
해당 내용은 다음 기회에 포스팅하러 오겠습니다~!
참고: https://laravel.kr/docs/5.8/passport
https://medium.com/modulr/create-api-authentication-with-passport-of-laravel-5-6-1dc2d400a7f
'PHP' 카테고리의 다른 글
[Laravel] Passport를 이용한 client_id, client_secret 발급하기(oauth) (0) | 2020.02.13 |
---|---|
[Laravel] MySQL 8.X 버전 인증 오류 (authentication method unknown to the client) (0) | 2020.02.11 |
[Laravel] laravelcollective/html https 적용하기 (0) | 2020.02.04 |
[Laravel] Laravel에서 AWS SES를 이용한 Mail 전송하기 (0) | 2020.01.28 |
[Laravel] Storage 권한 관련 문제 (0) | 2020.01.16 |