Впровадження Одноклассників OAuth аутентифікації для веб-сайтів
Одноклассники — частина екосистеми VK Group. Авторизація через OK актуальна для аудиторії 35+, особливо у Росії та СНГ. Реалізується через OAuth2 з особливостями підпису запитів до OK API.
Реєстрація додатка
- ok.ru/dk?st.cmd=appcenter (або розділ розробників)
- Створити зовнішнє додаток
- Указати адресу сайту й дозволені redirect URI
- Отримати: App ID, Public key, Secret key
Laravel Socialite
composer require laravel/socialite socialiteproviders/odnoklassniki
// config/services.php
'odnoklassniki' => [
'client_id' => env('OK_APP_ID'),
'client_secret' => env('OK_SECRET_KEY'),
'client_public' => env('OK_PUBLIC_KEY'),
'redirect' => env('OK_REDIRECT_URI'),
],
class OkAuthController extends Controller
{
public function redirect(): RedirectResponse
{
return Socialite::driver('odnoklassniki')
->scopes(['VALUABLE_ACCESS', 'GET_EMAIL'])
->redirect();
}
public function callback(): RedirectResponse
{
try {
$okUser = Socialite::driver('odnoklassniki')->user();
} catch (\Exception $e) {
return redirect('/login')->withErrors(['ok' => 'Помилка авторизації Одноклассників']);
}
$user = User::updateOrCreate(
['ok_id' => $okUser->getId()],
[
'name' => $okUser->getName(),
'email' => $okUser->getEmail() ?: null,
'avatar' => $okUser->getAvatar(),
]
);
Auth::login($user, remember: true);
return redirect()->intended('/dashboard');
}
}
Підпис запитів до OK API
OK API має специфіку: запити підписуються MD5-хешем від параметрів + session_secret_key. Socialite-провайдер обробляє це автоматично, але при прямих запитах до API потрібно враховувати:
function signOkRequest(array $params, string $accessToken, string $secretKey): string
{
ksort($params);
$paramString = '';
foreach ($params as $key => $value) {
$paramString .= "{$key}={$value}";
}
// session_secret_key = MD5(access_token + secret_key)
$sessionSecretKey = md5($accessToken . $secretKey);
return md5($paramString . $sessionSecretKey);
}
Доступні дані
| Поле | Доступність |
|---|---|
| UID (унікальний ID) | Завжди |
| Ім'я та прізвище | Завжди |
| Аватар | Завжди |
| Вимагає scope GET_EMAIL, може відсутствувати | |
| Дата народження | Через додатковий запит до users.getInfo |
| Місто | Через додатковий запит |
Терміни
1–2 дні.







