Реализация авторизации через Facebook на сайте
Facebook OAuth используется через Facebook Login SDK или стандартный OAuth2-флоу. Аудитория Facebook в России сократилась, но остаётся значимой для международных продуктов и платформ с широкой возрастной аудиторией.
Создание приложения в Meta Developer Console
- developers.facebook.com → My Apps → Create App
- Тип приложения: Consumer (для публичного входа)
- Добавить продукт Facebook Login → Web
- В настройках Facebook Login указать Valid OAuth Redirect URIs
- Зафиксировать App ID и App Secret
В режиме разработки приложение доступно только добавленным тестовым пользователям. Для публичного доступа нужно пройти App Review.
Laravel Socialite
// config/services.php
'facebook' => [
'client_id' => env('FACEBOOK_APP_ID'),
'client_secret' => env('FACEBOOK_APP_SECRET'),
'redirect' => env('FACEBOOK_REDIRECT_URI'),
],
class FacebookAuthController extends Controller
{
public function redirect(): RedirectResponse
{
return Socialite::driver('facebook')
->scopes(['email', 'public_profile'])
->redirect();
}
public function callback(): RedirectResponse
{
try {
$fbUser = Socialite::driver('facebook')->user();
} catch (\Exception $e) {
return redirect('/login')->withErrors(['facebook' => 'Ошибка авторизации']);
}
$user = User::updateOrCreate(
['facebook_id' => $fbUser->getId()],
[
'name' => $fbUser->getName(),
'email' => $fbUser->getEmail(),
'email_verified_at' => $fbUser->getEmail() ? now() : null,
'avatar' => $fbUser->getAvatar(),
]
);
Auth::login($user, remember: true);
return redirect()->intended('/dashboard');
}
}
Особенности Facebook
Email может отсутствовать. Если пользователь зарегистрирован по телефону или скрыл email от приложений — getEmail() вернёт null. Обрабатывать это нужно явно:
if (!$fbUser->getEmail()) {
// Предложить ввести email вручную после входа
session(['pending_facebook_id' => $fbUser->getId()]);
return redirect('/auth/complete-profile');
}
Аватар: Facebook возвращает ссылку на аватар, но она временная. Лучше скачать и сохранить локально при первом входе.
App Review: Для получения email достаточно стандартного разрешения email. Для дополнительных данных (друзья, посты) требуется прохождение App Review в Meta.
Facebook JavaScript SDK
Альтернатива redirect-флоу — кнопка через JS SDK:
<script>
window.fbAsyncInit = function() {
FB.init({ appId: '{{ config("services.facebook.client_id") }}', version: 'v19.0' });
};
</script>
<script async defer src="https://connect.facebook.net/ru_RU/sdk.js"></script>
<button onclick="fbLogin()">Войти через Facebook</button>
<script>
function fbLogin() {
FB.login(function(response) {
if (response.authResponse) {
fetch('/auth/facebook/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken },
body: JSON.stringify({ access_token: response.authResponse.accessToken }),
}).then(r => r.json()).then(data => {
window.location.href = data.redirect;
});
}
}, { scope: 'email,public_profile' });
}
</script>
// Верификация access_token через Graph API
public function handleToken(Request $request): JsonResponse
{
$response = Http::get('https://graph.facebook.com/me', [
'access_token' => $request->access_token,
'fields' => 'id,name,email,picture',
]);
if ($response->failed()) {
return response()->json(['error' => 'Invalid token'], 401);
}
$fbData = $response->json();
$user = User::updateOrCreate(
['facebook_id' => $fbData['id']],
['name' => $fbData['name'], 'email' => $fbData['email'] ?? null]
);
Auth::login($user);
return response()->json(['redirect' => '/dashboard']);
}
Деактивация и удаление данных
Meta требует реализации Data Deletion Callback — endpoint, на который Facebook отправляет запрос при удалении пользователем данных приложения:
Route::post('/auth/facebook/data-deletion', function (Request $request) {
// Подтвердить подпись запроса через HMAC-SHA256
// Удалить или анонимизировать данные пользователя
return response()->json([
'url' => 'https://example.com/deletion-status?id=' . $confirmationCode,
'confirmation_code' => $confirmationCode,
]);
});
Сроки
Стандартный OAuth2-флоу — 1–2 рабочих дня. С JS SDK, обработкой отсутствующего email и Data Deletion Callback — 3 дня.







