1. Laravel 社交家
composer require laravel/socialite
// config/services.php
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect' => env('APP_URL') . '/auth/google/callback',
],
// Routes
Route::get('/auth/{provider}/redirect', [SocialAuthController::class, 'redirect']);
Route::get('/auth/{provider}/callback', [SocialAuthController::class, 'callback']);
// Controller
use Laravel\Socialite\Facades\Socialite;
class SocialAuthController extends Controller
{
public function redirect(string $provider)
{
return Socialite::driver($provider)->redirect();
}
public function callback(string $provider)
{
$socialUser = Socialite::driver($provider)->user();
$user = User::updateOrCreate(
['email' => $socialUser->getEmail()],
[
'name' => $socialUser->getName(),
'provider' => $provider,
'provider_id' => $socialUser->getId(),
'avatar' => $socialUser->getAvatar(),
],
);
Auth::login($user, remember: true);
return redirect('/dashboard');
}
}
2.Laravelパスポート
composer require laravel/passport
php artisan passport:install
// User model
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens;
}
// config/auth.php
'guards' => [
'api' => ['driver' => 'passport', 'provider' => 'users'],
],
// Scopes
Passport::tokensCan([
'read-products' => 'Xem sản phẩm',
'write-products' => 'Thêm/sửa sản phẩm',
'manage-orders' => 'Quản lý đơn hàng',
]);
// Middleware
Route::middleware(['auth:api', 'scope:write-products'])->group(function () {
Route::post('/products', [ProductController::class, 'store']);
});
3. サンクタム vs パスポート
| 特長 | サンクタム | パスポート |
|---|---|---|
| SPA認証 | ✅ | ✅ |
| APIトークン | ✅ (シンプル) | ✅ (OAuth2 フル) |
| OAuth2サーバー | ❌ | ✅ |
| サードパーティのアプリ | ❌ | ✅ |
| 複雑さ | 低い | 高 |
次の記事: セキュリティのベストプラクティス。