Реализация авторизации через GitHub на сайте
GitHub OAuth используется на платформах для разработчиков, DevTools-сервисах, SaaS-продуктах с технической аудиторией. Один из самых чистых OAuth2-флоу — без сюрпризов с email или именем.
Регистрация OAuth App
- github.com → Settings → Developer settings → OAuth Apps → New OAuth App
- Заполнить: Application name, Homepage URL, Authorization callback URL
- Сохранить Client ID и сгенерировать Client Secret
GitHub App (не OAuth App) используется для доступа к репозиториям и организациям — для авторизации пользователей достаточно OAuth App.
Laravel Socialite
// config/services.php
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => env('GITHUB_REDIRECT_URI'),
],
class GitHubAuthController extends Controller
{
public function redirect(): RedirectResponse
{
return Socialite::driver('github')
->scopes(['user:email'])
->redirect();
}
public function callback(): RedirectResponse
{
try {
$githubUser = Socialite::driver('github')->user();
} catch (\Exception $e) {
return redirect('/login')->withErrors(['github' => 'Ошибка авторизации']);
}
$user = User::updateOrCreate(
['github_id' => $githubUser->getId()],
[
'name' => $githubUser->getName() ?? $githubUser->getNickname(),
'email' => $githubUser->getEmail(),
'email_verified_at' => now(),
'avatar' => $githubUser->getAvatar(),
'github_username' => $githubUser->getNickname(),
]
);
Auth::login($user, remember: true);
return redirect()->intended('/dashboard');
}
}
Особенности GitHub OAuth
Email может быть приватным. Если пользователь скрыл email в настройках GitHub, getEmail() вернёт null. Запрос с scope user:email позволяет получить email через дополнительный API-запрос:
// Явный запрос emails через API
$emails = Http::withToken($githubUser->token)
->get('https://api.github.com/user/emails')
->json();
// Найти основной подтверждённый email
$primaryEmail = collect($emails)
->firstWhere(fn($e) => $e['primary'] && $e['verified']);
Аватар: URL вида https://avatars.githubusercontent.com/u/{id}?v=4 — стабильный, не истекает.
GitHub username: Полезен для отображения в профиле или для создания ссылки на GitHub-профиль пользователя.
Ограничение по организациям
Если нужно разрешить вход только членам определённой GitHub-организации:
$membership = Http::withToken($githubUser->token)
->get("https://api.github.com/orgs/{$orgName}/members/{$githubUser->getNickname()}");
if ($membership->status() !== 204) {
Auth::logout();
return redirect('/login')->withErrors(['github' => 'Вход разрешён только для членов организации']);
}
Сроки
1–2 рабочих дня.







