👉 Аутентификация через Одноклассники

Почему oauth, а не виджет «войти через»?

Нет проблем. Если вас устраивают функционал, дизайн и уровень безопасности виджета — то его воткнуть в код на самом деле намного проще — можете дальше не читать.

Почему oauth, а не openid?

Потому что OpenID практически бесполезен для тех целей, для которых декларирован. Это сугубо мое мнение, но оно опирается не на пустое место.

Во-первых, OpenID пользуются в основном «гики», процент которых в интернете не настолько высок, чтобы перестраивать под них сайты (за некоторым исключением, разумеется 🙂 ) Почему так? Потому что для того, чтобы получить OpenID аккаунт, надо — его получить.

Зайти на OpenID сервер и предпринять некоторые действия, чтобы заполучить некий, довольно невразумительный, набор символов. Который, несмотря на сложность (для простого пользователя) надо не забыть и вводить при случае, если на глаза попадется знакомая пиктограмма

image

. Ну какой казуальный пользователь будет это делать? А с OAuth все намного проще — видит человек кнопку «Войти через ВКонтакте», нажимает, и… уже на сайте с правами зарегистрированного пользователя. «Будьте проще», — говорил классик, — «и люди к вам потянутся». Как в воду глядел.

Во-вторых, возможности OAuth далеко не исчерпываются аутентификацией и авторизацией. Получив в процессе авторизации токен, его можно использовать для дальнейшей интеграции возможностей социалки в свой ресурс — чтение/написание постов, доступ к френдленте и стене и многое другое.

В-третьих, OpenID активно пользуются спамеры и хакеры. Зачастую реализация OpenID аутентификации на ресурсе делается без особого внимания к известным его уязвимостям — по одному только описанию протокола на OpenID-провайдере или с помощью неизвестно кем и когда написанной библиотеки.

Похожее:  Интеграция с ЕСИА на базе oauth2-client (PHP) / Хабр

К примеру, многие сайты не требуют со входящих по OpenID ввода капчи. И ничто не мешает злоумышленнику поднять свой OpenID-сервер, который будет подтверждать любой идентификатор и начать спамить доверчивый сайт автоматически сгенеренными идентификаторами.

Кроме того, OpenID аутентификация, в сущности, не дает никаких гарантий клиенту. Она подтверждает лишь, что запрашиваемый пользователь действительно зарегистрирован на одном из OpenID-серверов — и все. Механизмы получения дополнительной информации о пользователе (email, имя, возраст) имеются, но мало кем поддерживаются.

Можно, конечно, в нарушение идей OpenID, анализировать идентификатор и доверять только определенным OpenID-провайдерам (например, тем же социалкам). Но смысл, если почти все из них (за исключением ЖЖ, но он и по OpenID ровным счетом ничего не расскажет о пользователе)

Google

1. Идем

. Создаем новый проект. На вкладке API access нажимаем кнопку «Create an OAuth2 client ID».

image

Получаем client_id(Client ID) и secret_key(Client Secret).

image

2. Код кнопки должен быть вида:

Авторизация на сайт одноклассники через curl (php) в обход api |

Может понадобится например для организации прокси сервиса или еще много для чего 🙂


$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.13) ' .
           'Gecko/20221203 Firefox/3.6.13 ( .NET CLR 3.5.30729)';

$login = 'логин'; 
$password = 'пароль';
$ch = curl_init();

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, 'http://www.odnoklassniki.ru/dk?cmd=AnonymLogin&st.cmd=anonymLogin&tkn=941');

$post = array(
           'st.redirect' => '',
           'st.posted' => 'set',
           'st.email' => $login,
           'st.password' => $password,
           'st.screenSize' => '',
           'st.browserSize' => '',
                       'st.flashVer' => ''
       );

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$answer = curl_exec($ch);

// в ответ получили главную страницу
echo $answer;

curl_close($ch);

Ваше приложение на одноклассниках создано!

Но чтобы через него получать email пользователя вам необходимо прислать id приложения (можно взять из письма) и перечень нужных разрешений с описанием кейса их использования на адрес

Вконтакте

1. Идем

. Тип — «Веб-сайт». Вводим базовый домен и адрес сайта. На странице настроек получаем client_id (ID приложения) и secret_key (защищенный ключ).

image

2. Втыкаем в код кнопку вида

Генерация ссылки для аутентификации

Создаем файл ok.php в папке social_login и записываем в него код:

Как авторизоваться с помощью одноклассников?

Ключ доступа (

access_token

) будет передан на страницу возврата, после авторизации пользователя.

Этот ключ необходимо выдернуть из адресной строки браузера и использовать для работы с API.

Вот на этой странице описан весь процесс.

1. Необходимо сформировать адрес для авторизации на основе шаблона (в одну строку, я разбил на несколько, чтобы влезло на один экран):

https://connect.ok.ru/oauth/authorize?client_id={clientId}&scope={scope}&
response_type=token&redirect_uri={redirectUri}&
layout={layout}&state={state}

response_type=token

, чтобы сервер Одноклассники вернул

access_token

в дополнительных параметрах (

hash

) страницы возврата.

Вместо {clientId} необходимо указать идентификатор своего приложения.

{scope} – права доступа, можно не указывать. Как минимум: VALUABLE_ACCESS;PHOTO_CONTENT, чтобы иметь возможность получить данные профиля пользователя.

{redirectUri} – страница возврата, на которой должен быть код (в данном случае код JavaScript), который извлечет из адреса полученный ключ доступа, ну или обработает ситуацию, если в процессе авторизации произойдет какая-нибудь ошибка или пользователь откажется давать права приложению.

{layout} – тип окна, скорее всего подойдет m – модальное окно, или a – упрощенное.

{state} – можно указать любое свое значение, которое будет передано в исходном виде на страницу возврата. Обычно используется для передачи собственного идентификатора сессии авторизации, либо идентификатора локального пользователя, чтобы можно было понять, какой именно собственный (локальный) пользователь проходит авторизацию. Этот параметр использовать не обязательно.

В итоге адрес страницы авторизации может быть примерно таким (в одну строку):

https://connect.ok.ru/oauth/authorize?client_id=000000000&
scope=VALUABLE_ACCESS;PHOTO_CONTENT&response_type=token&
redirect_uri=https://localhost/auth_result.html&layout=m

На локальном сервере можно создать страницу

https://localhost/auth_result.html

с кодом обработки результатов (см. п2).

2. Сделать страницу возврата (redirect_uri) и написать код извлечения ключа доступа и обработку ошибок.

При клиентской авторизации (response_type=token), сервер Одноклассники вернет параметры ответа в дополнительных параметрах документа (hash) в URL, которые можно найти в свойстве window.location.hash:

<script>
  alert(window.location.hash);
  // берем hash из url и разбиваем на массив по символу &
  var params = window.location.hash.substr(1).split('&');
  // перебираем массив
  for (var i = 0; i < params.length; i  )
  {
    // разбиваем текущий элемент массив на новый массив по знаку =
    var p = params[i].split('=');
    // на выходе будет два элемента ключ-значение
    // проверяем имя ключа
    if (p[0] == 'access_token')
    {
      // показываем значение
      alert('Нашли ключ доступа: '   p[1]); 
    }
  }
</script>

Как это работает.

Если кому интересны все подробности, то см. ссылки выше. А вкратце — так:

Одноклассники

1. Регистрируемся как разработчик

. Идем

и заполняем заявку на получение OAuth доступа. Н-да. Заявка, похоже, обрабатывается вручную. Если ответа в течение суток нет, пинаем поддержку по тому же адресу. «Одноклассники», что тут скажешь…

2. Получаем письмо с инструкциями и, следуя им, заполняем форму.

image


Все заполненные в примере поля обязательны к заполнению. Нажимаем «Сохранить» и получаем письмо на указанный емайл, содержащее client_id(Application ID), public_key(Публичный ключ приложения) и secret_key(Секретный ключ приложения)

3. Код кнопки должен быть вида:

Практические рекомендации по реализации

Разумеется, в первую очередь надо зарегистрироваться в соцсети, активировать аккаунт, ну и всё такое. Не торопиться. Некоторые сервера не сразу корректно обрабатывают запросы от свежезарегистрированных OAuth-клиентов. Здесь я расписал только успешные потоки, забывать про обработку ошибок — никак не стоит.

Также я практически не уделил внимания аспектам безопасности — это тема отдельной статьи. Как минимум, везде, где можно передавать уникальный параметр в callback-url для каждого пользователя — это стоит делать (Основной callback адрес должен оставаться без изменений, а меняться — только параметр, иначе сервер не пропустит запрос.

Регистрация нового приложения

Чтобы создать новое приложение перейдите по этой ссылке. Далее нажимаем на “Подключить oAuth” и заполняем форму.

Введите название приложения, путь к картинке размером 128×128. Укажите так же Список разрешённых redirect_uri, это список ссылок, на которые приложению разрешено делать редирект во время авторизации OAuth (параметр redirect_uri).

Теперь нажимаем на кнопку Сохранить и видим сообщение об успешном содании приложения.

Проверяем почту и видим там письмо от Одноклассников, в котором:

Шаг 2. генерация ссылки для аутентификации

Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:

Шаг 3. получение токена

Начинать процедуру аутентификации мы можем в том случае, если к нам пришёл параметр code. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.

В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `code` – url параметр, пришедший от одноклассников; `redirect_uri` – страница, на которую будет возвращён пользователь; `grand_type`, равный значению “authorization_code” – код активации; `client_id` – id приложения; `client_secret` – секретный ключ:

Шаг 4. получение информации о пользователе

Итак, теперь когда у нас есть параметры access_token, мы можем сделать запрос к Одноклассники API и получить информацию о пользователе. Перед тем, как мы подготовим массив с параметрами, которые в последствии превратим в фрагмент url строки, нам нужно сформировать специальную `подпись` запроса $sign с помощью конкатенации двух хэшей md5;

В параметр method записываем название метода API Одноклассников, который вернёт нам информацию о пользователе; Далее передаём access_token, публичный ключ (application_key), формат возвращаемых данных (format) и подпись запроса (sig).

Шаг 6. и снова дело за вами

Тут всё, как и в предыдущем случае. Если у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу.

После этого, всё что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.

На странице выхода из системы просто удаляем сессию с помощью функции unset.

Яндекс

1. Идем

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *