Laravelのsanctumを使ってみた

まずLaravelをセットアップしておいて、
sanctumをインストールし、
設定ファイルをパブリッシュし、
データベースを作成します。

```
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
```
ルートを設定します
```routes/api.php
// public routes
Route::post('/login', [AutoController::class, 'login']);
Route::post('/register', [AutoController::class, 'register']);
```


コントローラーを作成します。
```
php artisan make:controller AuthController
```
コントローラーを編集します。
```AutoController.php
class AutoController extends Controller
{
    public function login()
    {
        return 'login!';
    }

    public function register()
    {
        return 'register!';
    }
(略)
```

ここで一旦postmanとかでapiにリクエストしてみる。
サーバーは起動しておく。
urlはhttp://localhost/api/login
メソッドはpost
　　　
問題なければ次に進みます。
まずユーザーを作れるようにします。
リクエストファイルファイルを作成して編集
```terminal
php artisan make:request StoreUserRequest
```
```StoreUserRequest.php
(略)
use Illuminate\Validation\Rules;
(略)
public function authorize(): bool
    {
        return true;
    }

public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|string|max:255|unique:users',
            'password' => ['required','confirmed',Rules\Password::defaults()]
        ];
    }
(略)
```
コントローラーを編集します。
```AutoController.php
(略)
use App\Http\Requests\StoreUserRequest;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
(略)
public function register(StoreUserRequest $request)
    {
        $request->validated($request->all());

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password)
        ]);

        return response()->json([
            'user' => $user,
            'token' => $user->createToken('token'.$user->name)->plainTextToken
        ]);
    }
(略)
```
ここでpostmanでユーザーを作ってみます。
urlはhttp://localhost/api/register
メソッドはpost

Headersの設定に以下を追加
(key) Accept 　　　 (value) application/vnd.api+json
(key) Content-Type  (value) application/vnd.api+json

Bodyをform-dataにして以下を追加
(key) name  (value) test-name
(key) email  (value) test@test.com
(key) password  (value) test1234!
(key) password_confirmation  (value) test1234!

送信が成功したら、
ユーザーが作成できたかデーターベースも確認しておきます。
　　　　
　　
問題なければ次にログイン出来るようにします。
リクエストファイルファイルを作成して編集
```terminal
php artisan make:request LoginUserRequests
```
```LoginUserRequests.php
class LoginUserRequests extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'email' => 'required|string|email',
            'password' => 'required|string|min:6'
        ];
    }
}
```

コントローラーを編集します。
```AutoController.php
(略)
use App\Http\Requests\LoginUserRequests;
use Illuminate\Support\Facades\Auth;
(略)
public function login(LoginUserRequests $request)
    {
        $request->validated($request->all());

        if(!Auth::attempt($request->only('email', 'password'))){
            return response()->json([
                'status' => 'error',
                'message' =>'Invalid credentials'
            ], 401);
        }

        $use = User::where('email', $request->email)->first();

        return response()->json([
            'user' => $use,
            'token' => $use->createToken('token'.$use->name)->plainTextToken
        ]);
    }
(略)
```

ここでpostmanでログインしてみます。
urlはhttp://localhost/api/login
メソッドはpost


Headersの設定に以下を追加
(key) Accept 　　　 (value) application/vnd.api+json
(key) Content-Type  (value) application/vnd.api+json

Bodyをform-dataにして以下を追加
(key) email  (value) test@test.com
(key) password  (value) test1234!

送信が成功してトークンが帰ってきたら、
ここからやっとsanctumを使っていきます。

続く。。。