Как реализовать 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();
});