Lumen Passport API가 포함된 Vue 앱(2부)
인증 또는 인증?
일반적으로 소프트웨어 개발에서는 관련된 데이터가 있는 곳마다 일정 수준의 보안이 필요합니다. 인증은 데이터에 액세스하려는 사람을 식별하는 프로세스입니다. 반면에 권한 부여에는 사람의 액세스 수준을 확인하는 것이 포함됩니다. Passport를 사용하면 이를 달성할 수 있습니다.
우리가 만들 것
에서 설명한 것처럼 완성된 앱은 사용자가 연락처를 저장할 수 있는 연락처 앱이 됩니다. 이 부분에서는 로그인 및 등록으로 API를 설정합니다.
더 이상 고민하지 않고 ...
인증 컨트롤러 및 경로 설정
컨트롤러를 만들기 전에 기본 컨트롤러에서 일반적인 성공 응답을 만들어 보겠습니다.
<?php
namespace App\Http\Controllers;
use Laravel\Lumen\Routing\Controller as BaseController;
class Controller extends BaseController
{
public function return_success($message, $data = [], $status = 200)
{
return [
"message" => $message,
"data" => $data,
"status" => $status
];
}
}
이제 명령으로 컨트롤러를 만들어 보겠습니다.
php artisan make:controller AuthController
이 컨트롤러에 등록 및 로그인 방법을 추가합니다.
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\Response;
class AuthController extends Controller
{
public function login(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required'
]);
$user = User::where('email', $request->email)->first();
if ($user) {
if (Hash::check($request->password, $user->password)) {
$token = $user->createToken('Laravel Password Grant Client')->accessToken;
return $this->return_success("Login successful", ["token" => $token], Response::HTTP_OK);
} else {
$response = ["message" => "Password mismatch"];
return response($response, 422);
}
} else {
$response = ["message" => 'User does not exist'];
return response($response, 422);
}
}
public function register(Request $request)
{
$this->validate($request, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
$request['password'] = Hash::make($request['password']);
$request['remember_token'] = Str::random(10);
$user = User::create($request->toArray());
$token = $user->createToken('Laravel Password Grant Client')->accessToken;
return $this->return_success("User created successfully", ["user" => $user, "token" => $token], Response::HTTP_CREATED);
}
}
컨트롤러에 로그인 및 등록 방법이 있으며 경로 파일(예: route/web.php)에 해당 경로를 만들 수 있습니다.
$router->group(['prefix' => 'auth'], function() use ($router) {
$router->post('login', 'AuthController@login');
$router->post('register', 'AuthController@register');
});
Postman으로 인증 경로 테스트
우리는 우편 배달부에 사용자를 등록합니다
등록 성공!!!
등록한 이메일과 비밀번호로 로그인을 해보자.
로그인 성공!!!
이제 로그인 후 생성된 토큰으로 승인된 경로에 액세스할 수 있습니다. 다음으로 연락처 모델, 마이그레이션 및 경로를 만듭니다.
연락처 설정
명령을 사용하여 연락처에 대한 모델, 마이그레이션 및 컨트롤러를 생성합니다.
php artisan make:model Contact -mc
마이그레이션에 필요한 필드를 추가합니다.
Schema::create('contacts', function (Blueprint $table) {
$table->id();
$table->foreignId('owner_id');
$table->string('name');
$table->string('email')->nullable();
$table->string('phone_number')->unique();
$table->date('birthday')->nullable();
$table->timestamps();
});
모델은 다음과 같습니다.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Contact extends Model
{
protected $fillable = [
'name',
'email',
'phone_number',
'birthday',
'owner_id'
];
public function owner(): BelongsTo
{
return $this->belongsTo(User::class, 'owner_id');
}
}
컨트롤러의 경우 필요한 crud 메서드를 추가합니다.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ContactController extends Controller
{
public function index()
{
return $this->return_success("My contacts", auth('api')->user()->contacts, 200);
}
public function show($id)
{
/** @var User $user */
$user = auth('api')->user();
return $this->return_success("My contact", $user->contacts()->where('id', $id)->first(), 200);
}
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required',
'phone_number' => 'required'
]);
/** @var User $user */
$user = auth('api')->user();
$user->contacts()->create([
'name' => $request->get('name'),
'phone_number' => $request->get('phone_number'),
'birthday' => $request->get('birthday'),
'email' => $request->get('email')
]);
return $this->return_success("My contacts", $user->contacts()->latest()->get(), 200);
}
public function update(Request $request, $id)
{
$this->validate($request, [
'name' => 'required',
'phone_number' => 'required'
]);
/** @var User $user */
$user = auth('api')->user();
$contact = $user->contacts()->find($id);
$contact->update([
'name' => $request->get('name'),
'phone_number' => $request->get('phone_number'),
'birthday' => $request->get('birthday'),
'email' => $request->get('email')
]);
return $this->return_success("Contact updated", $contact, 200);
}
public function destroy($id)
{
/** @var User $user */
$user = auth('api')->user();
$contact = $user->contacts()->find($id);
$contact->delete();
return $this->return_success("Contact deleted", NULL, 200);
}
}
마이그레이션을 실행해 보겠습니다.
php artisan migrate
사용자 모델에 연락처 관계를 추가합니다.
public function contacts(): HasMany
{
return $this->hasMany(Contact::class, 'owner_id');
}
마지막으로 경로를 추가합니다.
$router->group(['middleware' => 'auth:api'], function() use ($router) {
$router->get('contacts', 'ContactController@index');
$router->get('contacts/{id}', 'ContactController@show');
$router->post('contacts', 'ContactController@store');
$router->patch('contacts/{id}', 'ContactController@update');
$router->delete('contacts/{id}', 'ContactController@destroy');
});
Postman으로 테스트
먼저 로그인을 하셔야 합니다. 생성된 토큰을 복사하면 이를 사용하여 연락처를 생성합니다.
연락처 생성에 필요한 필드를 제공합니다.
축하합니다. 로그인한 사용자의 연락처를 만들었습니다.
다음 자습서에서는 앱을 완성하고 Github에 푸시합니다.
Reference
이 문제에 관하여(Lumen Passport API가 포함된 Vue 앱(2부)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zichis/vue-app-with-lumen-passport-api-part-ii-5adi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)