OAuth認証は、ユーザー認証と権限管理を安全に実装するための標準プロトコルです。また、マイクロサービス間でセキュアな通信を確保することも重要です。今回は、LaravelでのOAuth認証の実装と、サービス間でのセキュアな通信方法について記述します。
目次
- OAuth認証の導入
- Laravel Passportの設定と使用
- サービス間のセキュアな通信
- 実践プロジェクトの例
1. OAuth認証の導入
OAuth認証は、第三者のアプリケーションがユーザーのリソースにアクセスするためのトークンベースの認証プロトコルです。Laravelでは、Laravel Passportを使用してOAuth認証を簡単に実装できます。
2. Laravel Passportの設定と使用
Passportのインストール
まず、Laravel Passportをインストールします。
composer require laravel/passport
インストール後、Passportのサービスプロバイダをconfig/app.php
に追加します。
'providers' => [
// 他のプロバイダ
Laravel\Passport\PassportServiceProvider::class,
],
次に、マイグレーションを実行し、Passportのテーブルを作成します。
php artisan migrate
php artisan passport:install
Passportの設定
app/User.php
モデルにPassportのトレイトを追加します。
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
AuthServiceProvider
でPassportルートを定義します。
namespace App\Providers;
use Laravel\Passport\Passport;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
API認証ミドルウェアの設定
config/auth.php
でAPI認証ガードを設定します。
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
認証ルートの設定
routes/api.php
に認証ルートを追加します。
use Illuminate\Http\Request;
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
トークン発行のエンドポイント
ユーザー登録時にトークンを発行する例を示します。
app/Http/Controllers/Auth/RegisterController.php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class RegisterController extends Controller
{
public function register(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
$token = $user->createToken('LaravelPassport')->accessToken;
return response()->json(['token' => $token], 200);
}
}
3. サービス間のセキュアな通信
トークンを使ったサービス間通信
サービス間で通信する際に、OAuthトークンを使用して認証を行います。Guzzleを使用して、トークン付きリクエストを送信します。
app/Http/Controllers/OrderController.php
namespace App\Http\Controllers;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class OrderController extends Controller
{
public function createOrder(Request $request)
{
$token = Auth::user()->createToken('OrderServiceToken')->accessToken;
$client = new Client();
$response = $client->post('http://127.0.0.1:8002/orders', [
'headers' => [
'Authorization' => 'Bearer ' . $token,
],
'json' => [
'user_id' => $request->user_id,
'product_id' => $request->product_id,
'quantity' => $request->quantity,
]
]);
return response()->json(json_decode($response->getBody()), $response->getStatusCode());
}
}
4. 実践プロジェクトの例
プロジェクト:OAuth認証とセキュアなサービス間通信
- ユーザーサービスでOAuth認証を設定
- 注文サービスでユーザーサービスからトークンを受け取り、注文を作成
- サービス間通信をセキュアに実装
routes/api.php
Route::middleware('auth:api')->group(function () {
Route::post('/orders', [OrderController::class, 'createOrder']);
});
まとめ
この記事では、LaravelでのOAuth認証の実装方法と、サービス間でのセキュアな通信方法について記述しました。OAuthを使用することで、ユーザー認証と権限管理がよりセキュアになり、トークンを使ったサービス間通信により、マイクロサービスアーキテクチャでのデータのやり取りも安全に行えます。