Sanctum & Socialite를 통한 Laravel 9 API 인증 및 Postman 테스트

25816 단어
Laravel Sanctum with Socialite API

(2022년 9월 23일 업데이트 : Flutter 앱 업데이트)

안녕하세요 여러분, 이것은 에 대한 나의 첫 번째 게시물입니다.
이 글에서는 매우 기본적인 방법으로 Laravel Sanctum with Socialite를 구현하는 방법을 보여드리겠습니다.

시작하겠습니다.

1. 새 Laravel 프로젝트를 만듭니다.
1단계: 터미널 OR 명령 프롬프트를 열고 다음 명령을 실행합니다.
composer create-project laravel/laravel test
또는 다음 명령으로:
laravel new test
2단계: 새 DB를 만든 다음 .env 파일로 이동하여 데이터베이스 세부 정보를 추가합니다.
예를 들어:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_name
DB_USERNAME=root
DB_PASSWORD=


2. Laravel Sanctum 패키지 설치:

1단계: Composer를 통해 Laravel Sanctum을 설치합니다.composer require laravel/sanctum
2단계: vendor:publish Artisan 명령을 사용하여 Sanctum 구성 및 마이그레이션 파일을 게시해야 합니다.

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"


3단계: app/Http/Kernel.php 파일에서 Sanctum 미들웨어의 주석 처리를 제거합니다.

'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],


4단계: Laravel Socialite는 암호가 필요하지 않으므로 사용자 테이블로 이동하여 passwordnullable()로 설정합니다.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password')->nullable();
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
};



5단계: 이제 사용자 로그인 및 등록을 처리하기 위해 AuthController를 생성해야 합니다.php artisan make:controller AuthController
이것은 견인 기능registerlogin이 있는 매우 간단한 인증 컨트롤러입니다.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $validator = Validator::make($request->only('name', 'email', 'password', 'password_confirmation'), [
            'name' => ['required', 'min:2', 'max:50', 'string'],
            'email' => ['required', 'email', 'unique:users,email'],
            'password' => ['required', 'min:6', 'max:255', 'confirmed', 'string'],
        ]);
        if ($validator->fails())
            return response()->json($validator->errors(), 400);
        $input = $request->only('name', 'email', 'password');
        $input['password'] = Hash::make($request['password']);
        $user = User::create($input);
        $data =  [
            'token' => $user->createToken('Sanctom+Socialite')->plainTextToken,
            'user' => $user,
        ];
        return response()->json($data, 200);
    }

    public function login(Request $request)
    {
        $validator = Validator::make($request->only('email', 'password'), [
            'email' => ['required', 'email', 'exists:users,email'],
            'password' => ['required', 'min:6', 'max:255', 'string'],
        ]);
        if ($validator->fails())
            return response()->json($validator->errors(), 400);
        if (Auth::attempt(['email' => $request->email, 'password' => $request->password])) {
            $user = $request->user();
            $data =  [
                'token' => $user->createToken('Sanctom+Socialite')->plainTextToken,
                'user' => $user,
            ];
            return response()->json($data, 200);
        }
    }
}



3.Laravel Socialite 패키지 설치:
1단계: Socialite를 시작하려면 Composer 패키지 관리자를 사용하여 패키지를 프로젝트의 종속성에 추가합니다.composer require laravel/socialite
2단계: Socialite를 사용하기 전에 애플리케이션에서 사용하는 OAuth 공급자에 대한 자격 증명을 추가해야 합니다.

'google' => [
        'client_id' => env('GOOGLE_CLIENT_ID'),
        'client_secret' => env('GOOGLE_CLIENT_SECRET'),
        'redirect' => 'GOOGLE_REDIRECT_URI',
    ],


이것은 Google 토큰에 대해서만 작동한다는 것을 기억하십시오.
API를 구축하고 있으므로 소셜라이트가 작동하도록 하기 위해 config/services.php 파일에 아무 것도 설정할 필요가 없습니다.

3단계: 정리된 상태를 유지하려면 공급자를 통한 로그인을 처리할 새 컨트롤러가 필요하므로 다음과 같이 생성합니다.
.env
이제 우리는 로그인을 처리하기 위한 견인 기능php artisan make:controller SocialiteController과 사용된 공급자를 확인하기 위한 기능handleProviderCallback을 만들어야 합니다.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Laravel\Socialite\Facades\Socialite;
use Illuminate\Support\Facades\Validator;

class SocialiteController extends Controller
{
    public function handleProviderCallback(Request $request)
    {
        $validator = Validator::make($request->only('provider', 'access_provider_token'), [
            'provider' => ['required', 'string'],
            'access_provider_token' => ['required', 'string']
        ]);
        if ($validator->fails())
            return response()->json($validator->errors(), 400);
        $provider = $request->provider;
        $validated = $this->validateProvider($provider);
        if (!is_null($validated))
            return $validated;
        $providerUser = Socialite::driver($provider)->userFromToken($request->access_provider_token);
        $user = User::firstOrCreate(
            [
                'email' => $providerUser->getEmail()
            ],
            [
                'name' => $providerUser->getName(),
            ]
        );
        $data =  [
            'token' => $user->createToken('Sanctom+Socialite')->plainTextToken,
            'user' => $user,
        ];
        return response()->json($data, 200);
    }

    protected function validateProvider($provider)
    {
        if (!in_array($provider, ['google'])) {
            return response()->json(["message" => 'You can only login via google account'], 400);
        }
    }
}



4단계: 이제 API 경로를 만들어야 하므로 validateProvider로 이동하여 다음 경로를 추가합니다.

use App\Http\Controllers\AuthController;
use App\Http\Controllers\SocialiteController;
Route::controller(AuthController::class)->group(function () {
    Route::post('/', 'register');
    Route::post('/login', 'login');
});

Route::post('/login/callback', [SocialiteController::class, 'handleProviderCallback']);


5단계: 실행:routes/api.php그리고 :php artisan migrate
이제 코드를 완료했으므로 우편 배달부로 이동하여 경로를 테스트해 보겠습니다.
일반 등록 및 로그인 테스트:
등록하다:


소셜라이트를 통해:



이제 access_provider_token을 얻는 방법이 궁금할 수 있습니다. 저는 이 토큰을 얻기 위해 친구가 만든 Flutter 애플리케이션을 사용하고 있습니다.

Flutter 앱의 일부 이미지:


다음은 Google 토큰입니다.

HERE에서 앱을 다운로드할 수 있습니다.php artisan servdd에서 $providerUser에 의해 Google 토큰으로 제공되는 모든 사용자 정보를 볼 수 있습니다.


이 프로젝트의 소스 코드는 github에서 얻을 수 있습니다.

끝으로 이 글이 여러분에게 유용하고 도움이 되기를 바라며, 이는 글이 너무 길지 않도록 아주 단순한 형태의 코드일 뿐이라는 점을 기억해두시기 바랍니다.
Providers Table), Laravel Socialite에 등록된 각 사용자를 이 테이블에 연결하고 사용자 Provider 및 기타 세부 정보를 기록하고 자신의 손길을 잊지 마십시오.

질문이 있으시면 이 게시물에 자유롭게 댓글을 달아주세요.

좋은 웹페이지 즐겨찾기