Finish add Passport

master
sundayenglish 4 weeks ago
parent 4ce36683be
commit 09237b7e02
  1. 4
      app/Models/User.php
  2. 20
      app/Providers/AuthServiceProvider.php
  3. 5
      config/auth.php
  4. 42
      database/migrations/2025_06_20_035905_create_oauth_device_codes_table.php
  5. 14
      database/migrations/2025_06_20_080224_create_oauth_auth_codes_table.php
  6. 14
      database/migrations/2025_06_20_080225_create_oauth_access_tokens_table.php
  7. 12
      database/migrations/2025_06_20_080226_create_oauth_refresh_tokens_table.php
  8. 19
      database/migrations/2025_06_20_080227_create_oauth_clients_table.php
  9. 28
      database/migrations/2025_06_20_080228_create_oauth_personal_access_clients_table.php
  10. 5
      routes/api.php

@ -6,11 +6,13 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
use Laravel\Passport\Contracts\OAuthenticatable;
class User extends Authenticatable
{
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable;
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.

@ -3,13 +3,10 @@
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Bridge\RefreshTokenRepository;
use Laravel\Passport\Bridge\AccessTokenRepository;
use Laravel\Passport\Bridge\ClientRepository;
use Laravel\Passport\Bridge\ScopeRepository;
use Laravel\Passport\Bridge\UserRepository;
use Laravel\Passport\Passport;
use League\OAuth2\Server\AuthorizationServer;
use League\OAuth2\Server\Grant\PasswordGrant;
use Laravel\Passport\Bridge\UserRepository;
use Laravel\Passport\Bridge\RefreshTokenRepository;
use DateInterval;
class AuthServiceProvider extends ServiceProvider
@ -18,18 +15,17 @@ class AuthServiceProvider extends ServiceProvider
public function boot(): void
{
$this->registerPolicies();
Passport::tokensExpireIn(now()->addHour());
Passport::refreshTokensExpireIn(now()->addMonth());
// Thêm cấu hình hỗ trợ password grant
$this->app->afterResolving(AuthorizationServer::class, function ($server) {
$grant = new PasswordGrant(
$grant = new \League\OAuth2\Server\Grant\PasswordGrant(
app(UserRepository::class),
app(RefreshTokenRepository::class)
);
$grant->setRefreshTokenTTL(new DateInterval('P1M')); // 1 tháng
$grant->setRefreshTokenTTL(new DateInterval('P1M')); // Thời gian sống refresh token: 1 tháng
$server->enableGrantType($grant, new DateInterval('PT1H')); // Access token sống 1 giờ
$server->enableGrantType($grant, new DateInterval('PT1H')); // 1 giờ
});
}
}

@ -40,6 +40,11 @@ return [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport', // ← Quan trọng: phải là 'passport'
'provider' => 'users',
],
],
/*

@ -1,42 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('oauth_device_codes', function (Blueprint $table) {
$table->char('id', 80)->primary();
$table->foreignId('user_id')->nullable()->index();
$table->foreignUuid('client_id')->index();
$table->char('user_code', 8)->unique();
$table->text('scopes');
$table->boolean('revoked');
$table->dateTime('user_approved_at')->nullable();
$table->dateTime('last_polled_at')->nullable();
$table->dateTime('expires_at')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('oauth_device_codes');
}
/**
* Get the migration connection name.
*/
public function getConnection(): ?string
{
return $this->connection ?? config('passport.connection');
}
};

@ -12,9 +12,9 @@ return new class extends Migration
public function up(): void
{
Schema::create('oauth_auth_codes', function (Blueprint $table) {
$table->char('id', 80)->primary();
$table->foreignId('user_id')->index();
$table->foreignUuid('client_id');
$table->string('id', 100)->primary();
$table->unsignedBigInteger('user_id')->index();
$table->unsignedBigInteger('client_id');
$table->text('scopes')->nullable();
$table->boolean('revoked');
$table->dateTime('expires_at')->nullable();
@ -28,12 +28,4 @@ return new class extends Migration
{
Schema::dropIfExists('oauth_auth_codes');
}
/**
* Get the migration connection name.
*/
public function getConnection(): ?string
{
return $this->connection ?? config('passport.connection');
}
};

@ -12,9 +12,9 @@ return new class extends Migration
public function up(): void
{
Schema::create('oauth_access_tokens', function (Blueprint $table) {
$table->char('id', 80)->primary();
$table->foreignId('user_id')->nullable()->index();
$table->foreignUuid('client_id');
$table->string('id', 100)->primary();
$table->unsignedBigInteger('user_id')->nullable()->index();
$table->unsignedBigInteger('client_id');
$table->string('name')->nullable();
$table->text('scopes')->nullable();
$table->boolean('revoked');
@ -30,12 +30,4 @@ return new class extends Migration
{
Schema::dropIfExists('oauth_access_tokens');
}
/**
* Get the migration connection name.
*/
public function getConnection(): ?string
{
return $this->connection ?? config('passport.connection');
}
};

@ -12,8 +12,8 @@ return new class extends Migration
public function up(): void
{
Schema::create('oauth_refresh_tokens', function (Blueprint $table) {
$table->char('id', 80)->primary();
$table->char('access_token_id', 80)->index();
$table->string('id', 100)->primary();
$table->string('access_token_id', 100)->index();
$table->boolean('revoked');
$table->dateTime('expires_at')->nullable();
});
@ -26,12 +26,4 @@ return new class extends Migration
{
Schema::dropIfExists('oauth_refresh_tokens');
}
/**
* Get the migration connection name.
*/
public function getConnection(): ?string
{
return $this->connection ?? config('passport.connection');
}
};

@ -12,13 +12,14 @@ return new class extends Migration
public function up(): void
{
Schema::create('oauth_clients', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->nullableMorphs('owner');
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id')->nullable()->index();
$table->string('name');
$table->string('secret')->nullable();
$table->string('secret', 100)->nullable();
$table->string('provider')->nullable();
$table->text('redirect_uris');
$table->text('grant_types');
$table->text('redirect');
$table->boolean('personal_access_client');
$table->boolean('password_client');
$table->boolean('revoked');
$table->timestamps();
});
@ -31,12 +32,4 @@ return new class extends Migration
{
Schema::dropIfExists('oauth_clients');
}
/**
* Get the migration connection name.
*/
public function getConnection(): ?string
{
return $this->connection ?? config('passport.connection');
}
};

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('oauth_personal_access_clients', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('client_id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('oauth_personal_access_clients');
}
};

@ -7,7 +7,6 @@ use Laravel\Passport\Bridge\AccessTokenRepository;
use Laravel\Passport\TokenRepository;
use Laravel\Passport\Passport;
Route::post('/oauth/token', function (ServerRequestInterface $serverRequest) {
return app()->make(\Laravel\Passport\Http\Controllers\AccessTokenController::class)
->issueToken($serverRequest);
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});

Loading…
Cancel
Save