diff --git a/app/Models/User.php b/app/Models/User.php index bb6db4489..6b65ad7e1 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -20,6 +20,7 @@ class User extends Authenticatable implements OAuthenticatable protected function casts(): array { return [ + 'is_admin' => 'boolean', 'deleted_at' => 'datetime', 'email_verified_at' => 'datetime', '2fa_setup_at' => 'datetime', @@ -41,9 +42,16 @@ class User extends Authenticatable implements OAuthenticatable * @var array */ protected $hidden = [ - 'email', 'password', 'is_admin', 'remember_token', - 'email_verified_at', '2fa_enabled', '2fa_secret', - '2fa_backup_codes', '2fa_setup_at', 'deleted_at', + 'email', + 'password', + 'is_admin', + 'remember_token', + 'email_verified_at', + '2fa_enabled', + '2fa_secret', + '2fa_backup_codes', + '2fa_setup_at', + 'deleted_at', 'updated_at', ]; diff --git a/app/Passport/ScopeRepository.php b/app/Passport/ScopeRepository.php new file mode 100644 index 000000000..f4114f539 --- /dev/null +++ b/app/Passport/ScopeRepository.php @@ -0,0 +1,47 @@ +is_admin) { + return $scopes; + } + + // No user (client_credentials) or a non-admin user: never issue admin scopes. + return collect($scopes) + ->reject(fn ($scope) => self::isAdminScope($scope->getIdentifier())) + ->values() + ->all(); + } +} diff --git a/app/Providers/PassportServiceProvider.php b/app/Providers/PassportServiceProvider.php index a9e17e8fb..6e588e49c 100644 --- a/app/Providers/PassportServiceProvider.php +++ b/app/Providers/PassportServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Passport\CachedPersonalAccessClientRepository; +use App\Passport\ScopeRepository; use Laravel\Passport\Bridge; use Laravel\Passport\ClientRepository; use Laravel\Passport\Passport; @@ -26,7 +27,7 @@ class PassportServiceProvider extends \Laravel\Passport\PassportServiceProvider return tap(new AuthorizationServer( $this->app->make(Bridge\ClientRepository::class), $this->app->make(Bridge\AccessTokenRepository::class), - $this->app->make(Bridge\ScopeRepository::class), + $this->app->make(ScopeRepository::class), $this->makeCryptKey('private'), Passport::tokenEncryptionKey($this->app->make('encrypter')), $responseType ?? Passport::$authorizationServerResponseType diff --git a/resources/views/auth/oauth/authorize.blade.php b/resources/views/auth/oauth/authorize.blade.php index e5355b119..a87f0da5e 100644 --- a/resources/views/auth/oauth/authorize.blade.php +++ b/resources/views/auth/oauth/authorize.blade.php @@ -1,5 +1,6 @@ +
@@ -7,93 +8,340 @@