diff --git a/src/SanctumServiceProvider.php b/src/SanctumServiceProvider.php index b37400b..0231c32 100644 --- a/src/SanctumServiceProvider.php +++ b/src/SanctumServiceProvider.php @@ -114,7 +114,7 @@ protected function createGuard($auth, $config) return new RequestGuard( new Guard($auth, config('sanctum.expiration'), $config['provider']), $this->app['request'], - $auth->createUserProvider() + $auth->createUserProvider($config['provider'] ?? null) ); } diff --git a/tests/GuardTest.php b/tests/GuardTest.php index 2d8ec85..525291d 100644 --- a/tests/GuardTest.php +++ b/tests/GuardTest.php @@ -3,6 +3,8 @@ namespace Laravel\Sanctum\Tests; use DateTimeInterface; +use Illuminate\Auth\EloquentUserProvider; +use Illuminate\Auth\RequestGuard; use Illuminate\Contracts\Auth\Factory as AuthFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; @@ -51,7 +53,7 @@ public function test_authentication_is_attempted_with_web_middleware() $user = $guard->__invoke(Request::create('/', 'GET')); - $this->assertTrue($user === $fakeUser); + $this->assertSame($user, $fakeUser); $this->assertTrue($user->tokenCan('foo')); } @@ -160,6 +162,74 @@ public function test_authentication_is_successful_with_token_if_no_session_prese $this->assertInstanceOf(DateTimeInterface::class, $returnedUser->currentAccessToken()->last_used_at); } + public function test_authentication_with_token_fails_if_user_provider_is_invalid() + { + $this->loadLaravelMigrations(['--database' => 'testbench']); + $this->artisan('migrate', ['--database' => 'testbench'])->run(); + + config(['auth.guards.sanctum.provider' => 'users']); + config(['auth.providers.users.model' => 'App\Models\User']); + + $factory = $this->app->make(AuthFactory::class); + $requestGuard = $factory->guard('sanctum'); + + $request = Request::create('/', 'GET'); + $request->headers->set('Authorization', 'Bearer test'); + + $user = User::forceCreate([ + 'name' => 'Taylor Otwell', + 'email' => 'taylor@laravel.com', + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', + 'remember_token' => Str::random(10), + ]); + + $token = PersonalAccessToken::forceCreate([ + 'tokenable_id' => $user->id, + 'tokenable_type' => get_class($user), + 'name' => 'Test', + 'token' => hash('sha256', 'test'), + ]); + + $returnedUser = $requestGuard->setRequest($request)->user(); + + $this->assertNull($returnedUser); + $this->assertInstanceOf(EloquentUserProvider::class, $requestGuard->getProvider()); + } + + public function test_authentication_is_successful_with_token_if_user_provider_is_valid() + { + $this->loadLaravelMigrations(['--database' => 'testbench']); + $this->artisan('migrate', ['--database' => 'testbench'])->run(); + + config(['auth.guards.sanctum.provider' => 'users']); + config(['auth.providers.users.model' => User::class]); + + $factory = $this->app->make(AuthFactory::class); + $requestGuard = $factory->guard('sanctum'); + + $request = Request::create('/', 'GET'); + $request->headers->set('Authorization', 'Bearer test'); + + $user = User::forceCreate([ + 'name' => 'Taylor Otwell', + 'email' => 'taylor@laravel.com', + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', + 'remember_token' => Str::random(10), + ]); + + $token = PersonalAccessToken::forceCreate([ + 'tokenable_id' => $user->id, + 'tokenable_type' => get_class($user), + 'name' => 'Test', + 'token' => hash('sha256', 'test'), + ]); + + $returnedUser = $requestGuard->setRequest($request)->user(); + + $this->assertEquals($user->id, $returnedUser->id); + $this->assertInstanceOf(EloquentUserProvider::class, $requestGuard->getProvider()); + } + protected function getPackageProviders($app) { return [SanctumServiceProvider::class];