Как реализовать oauth2 и проверять, чтобы пользователь не запретил доступ к его данным серверу и, если это так, logout пользователя

Я пытаюсь реализовать oauth2 и столкнулся со следующей проблемой: Если пользователь запретит доступ приложения к его данным, то как мне понять это? Из идей при каждом запросе проверять это путём запроса данных пользователя по его access токену. Но это дикий костыль и на больших приложениях будет перегружать сервер и google может выдавать 429 что вызовет дикие лаги. Пока что регистрацию реализовал как-то так:

            $date = new DateTime();

            $gdata = $this->getGoogleAccessTokenByCode($_GET['code']);
            $user = $this->getGoogleUserByAccessToken($gdata["access_token"]);

            // Log in if the users exists
            if (User::where('email', $user->email)->exists() && $user->verifiedEmail) {
                Log::debug("updating user");
                $dbuser = User::where('email', $user->email);

                $dbuser->update([
                    "google_access_token" => $gdata["access_token"],
                    "google_expires_in" => $gdata["expires_in"],
                    "google_refresh_token" => $gdata["refresh_token"],
                    "google_id" => $user->id
                ]);
                if (!$dbuser->get()[0]->email_verified_at)
                    $dbuser->update(["email_verified_at" => $date]);

                if (!$dbuser->get()[0]->avatar)
                    $dbuser->update(["avatar" => $user->picture]);

                Auth::login($dbuser->get()[0]);
                return redirect(RouteServiceProvider::HOME)->with('status', 'Successfully logged in you!');
            } else { // Create user
                Log::debug("creating user");
                $dbuser = User::create([
                    'username' => $user->name,
                    'email' => $user->email,
                    "password" => $gdata["refresh_token"],
                    "avatar" => $user->picture,
                    "google_access_token" => $gdata["access_token"],
                    "google_expires_in" => $gdata["expires_in"],
                    "google_refresh_token" => $gdata["refresh_token"],
                    "google_id" => $user->id,
                ]);
                if ($user->verified)
                    $dbuser->update(["email_verified_at" => $date]);

                event(new Registered($dbuser));

                Auth::login($dbuser);

                return redirect(RouteServiceProvider::HOME)->with('status', 'Successfully registered you!');

и миграции

Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('username');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->string('avatar')->nullable();
            $table->integer('privelege')->default(0);
            $table->string('discord_access_token')->nullable();
            $table->string('discord_expires_in')->nullable();
            $table->string('discord_refresh_token')->nullable();
            $table->string('discord_id')->nullable();
            $table->string('telegram_access_token')->nullable();
            $table->string('telegram_expires_in')->nullable();
            $table->string('telegram_id')->nullable();
            $table->string('google_access_token')->nullable();
            $table->string('google_expires_in')->nullable();
            $table->string('google_refresh_token')->nullable();
            $table->string('google_id')->nullable();
            $table->timestamps();
        });

Ответы (0 шт):