Web

[Laravel] Token 인증 (sanctum) + mysql 연동

야채곱창의 개발기록 2023. 11. 10. 12:30

주니어에게 줘야할 문서를 노션으로 작업하여 tistory에 남겨본다.

우선적으로 하면 좋은 것들 : postman, mysql, sqlite3 설치


Token 인증 (sanctum)

 

    1. composer.json 파일 확인하기최신버전의 라라벨에는 sanctum이 이미 설치되어 있다.
      composer.json에 sanctum이 있는지 확인한 뒤 설치 여부를 결정하면 된다.
      • path : Laravel/composer.json 
  1. sanctum이 존재하지 않는다면 설치
    composer require laravel/sanctum
    
    # Sanctum의 설정을 내보내고(publish)
    # vendor:publish 아티즌 명령어를 사용해서 파일을 마이그레이션
    # sanctum 설정 파일은 애플리케이션의 config 디렉토리에 위치
    php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
    
    # migration (token을 위한 "personal_access_tokens" table이 생성된다.)
    php artisan migrate

 

  1. Sanctum 미들웨어를 추가
    (애플리케이션의 app/Http/Kernel.php 파일에 있는api 미들웨어 그룹에 Sanctum 미들웨어를 추가)
    # app/Http/Kernel.php
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    ],

 

  1. Database (sqlite3) 권한 변경 (+ 확인 위해 없으면 설치)
    # sqlite3가 없다면 설치한다.
    sudo apt-get install sqlite3
    
    # 설치 이후 sqlite3는 다음과 같이 확인할 수 있다.
    sqlite3 /full/path/Laravel/database/database.sqlite # DB 접속
    > .databases # 데이터베이스 확인
    > .tables # 테이블 확인
    > select * from users #쿼리
    > .quit #종료
    
    # db 관련 권한 변경
    sudo chmod -R 775 /full/path/Laravel/database
    sudo chown -R user:www-data /full/path/Laravel/database

 

  1. User Model 확인
    • User Model에서 “HasApiTokens” 트레잇(trait)을 사용하는지 확인
      (거창하게 설명되어있지만 import 확인이라 생각하면 편하다.)
      User Path : /full/path/Laravel/app/Models/User.php
      HasApiTokens Path : /full/path/Laravel/Sanctum/HasApiTokens

    • 이후 User 모델이 어떻게 구성되어있는지 확인해본다.

 

  1. 토큰 인증을 위한 회원 가입 및 토큰 발급
    # /full/path/Laravel/routes/api.php
    
    use Illuminate\Http\Request;
    
    // Add user
    Route::post('/sanctum/register',function (Request $request) {
        User::create([
            'email' => $request->input('email'),
            'password' => bcrypt($request->input('password')),
            'name' => $request->input('name')
        ]);
        return response()->json(['message'=>'success'], 200);
    });
    
    
    // Token 발급
    Route::post('/sanctum/token', function (Request $request) {
    
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);
    
        $user = User::where('email', $request->email)->first();
    
        if (! $user || ! Hash::check($request->password, $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['The provided credentials are incorrect.'],
            ]);
        }
    
        return $user->createToken('token-name')->plainTextToken;
    });

 

  • 6-1. Postman으로 회원가입(추가) 및 토큰 발급
    • 회원가입
      1. Postman에서 post 방식 선택
      1. Post 보낼 URL을 입력
      1. Params에 Key : Value 형태로 이메일, 패스워드, 이름을 추가
      1. 이후 Send 버튼 눌러서 전송
      1. Response (결과값) 으로 상태값 200과 메시지 success가 온다면 성공.
    • 토큰 발급
      1. 위와 같지만 post url, key:value를 바꾸어준 뒤 보내주면 Token이 발급되어서 response로 들어온다.

 

  • 6-2. 발급된 토큰 데이터베이스에서 확인

 

  1. API 요청
    7-1. Token을 발급받았으니 API 요청하여 결과값을 받아보자.
    # 6. 토큰 인증을 위한 회원 가입 및 토큰 발급 에서 이어짐
    # /full/path/Laravel/routes/api.php
    
    Route::middleware(['auth:sanctum'])->group(function () {
        Route::get('/users',function (Request $request){
            return User::find(1);
        });
    });

    7-2. Postman Test

      - GET 방식 선택

      - 요청 URL 입력

      - 인증방식(Authorization) - Bearer Token 선택 > Toekn값 (6-1에서 받은) 값을 넣어주고 Send

      - 그럼 response 값이 아래처럼 온다


 

  1. 토큰 해지 또는 만료 설정
    기본 설정으로 생성된 토큰은 만료되지 않는다. (토큰 해지를 해줘야 만료된다.)

        8-1. 토큰 만료 설정
               토큰만료를 위해 expiration 설정을 해줄 수 있다.

# /full/path/Laravel/config/sanctum.php

//  'expiration' => null, // default, 영구사용가능
'expiration' => 525600, // 분 단위

// $schedule->command('sanctum:prune-expired --hours=24')->daily();

 

 

- 추가적으로
기본 인증에 사용되는 User 모델, users table을 사용하기 싫다면 config/auth.php 에서 provider를 수정해주면 된다.

# /var/www/html/lara/config/auth.php

'providers' => [
        'users' => [
            'driver' => 'eloquent',
						//'table' => 'CreateTableName',
            'model' => App\Models\CreateModelName::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

 

이로써

기본적인 Sanctum Token 인증 구현은 끝이다.

 


 

Mysql 연동

 

  1. Laravel에서 쓸 데이터베이스를 하나 만든다.
    sudo mysql -u root -p
    
    > create database databaseName;
    > flush privileges;
    > exit

 

  1. env 파일을 수정한다.
    # /full/path/Laravel/.env
    
    # DB_CONNECTION=sqlite
    # DB_HOST=127.0.0.1
    # DB_PORT=3306
    # # DB_DATABASE=laravel
    # DB_USERNAME=root
    # DB_PASSWORD=
    
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1 # == localhost
    DB_PORT=3306 # Database default port
    DB_DATABASE=databaseName
    DB_USERNAME=root
    DB_PASSWORD=password

 

  1. 라라벨 인증단 + mysql 연동
    # 1. 생성해야하는 테이블이 있다면
    php artisan make:migration create_테이블이름_table; 
    
    # 1-1. /full/path/Laravel/database/migrations/[DATE]_create_테이블이름_table.php
    # 생성된 파일을 입맛에 맞게 수정한 뒤 migrate
    php artisan migrate
    
    
    # 2. 생성할 테이블이 없이 기본 인증만 테스트하거나 사용할 계획이라면
    # 그냥 마이그레이션 해준다.
    php artisan migrate
    
    
    # 3. 이후 mysql에 접속해서 table이 제대로 생성되었는지 확인해준다.
    sudo mysql -u root -p
    > use databaseName;
    > show tables;
    > exit;

       데이터베이스가 정상적으로 생성되었다면 아래와 같이 보일 것이다.


 

  1. Token 인증 6-7번 Postman Test를 실행한 뒤 데이터베이스에 값이 제대로 들어오는지 확인

 

 

  1. DB 연동까지 완료되었다.

[참고1] [참고2] [참고3]

 

'Web' 카테고리의 다른 글

POST인데 Ajax(axios) 데이터가 잘려요!  (0) 2024.10.23
[JS] 데이터 Excel로 Export (Json + Other or Header)  (0) 2024.04.19
[JS] async, await with ajax  (0) 2024.04.02