Реализация авторизации через Одноклассники на сайте
Одноклассники — часть экосистемы 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 рабочих дня.







