Аутентификация через ВКонтакте

С каждым днём влияние социальных сетей и сервисов только крепчает. Это означает, что нам, как веб разработчикам нужно это учитывать. Сегодня я расскажу и покажу, как создать аутентификацию ваших пользователей через социальную сеть ВКонтакте. Для этого мы не будем пользоваться какими-то сторонними библиотеками, а реализуем всё с нуля, собственными руками. Думаю, многие ждали подобного урока, так что томить не буду. Начнём!

sourse

Заметка. Пример, созданный в данном уроке, предназначен для работы на локальном сервере.

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

Для начала нам необходимо создать новое приложение на сайте социальной сети ВКонтакте

В открывшейся форме введите название приложения; выберите тип “Веб-сайт”; В качестве адреса сайта введите путь к папке с проектом на вашем локальном сервере. В моём случае, это http://localhost/vk-auth. Базовый домен: localhost.

После нажатия на кнопку “Подключить сайт”, вам наверняка придётся ввести проверочный код, который придёт по смс. Если вы пройдёте проверку, то вам должна открыться следующая форма с настройками приложения.

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

Из данной формы нам понадобятся такие данные, как `ID приложения`, `Защищённый ключ`, `Адрес сайта`. Запишем их в специальные переменные в файле index.php:

<?php

$client_id = '3485070'; // ID приложения
$client_secret = 'lYjfUZwZmlJJlFIqQFAj'; // Защищённый ключ
$redirect_uri = 'http://localhost/vk-auth'; // Адрес сайта

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

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

$url = 'http://oauth.vk.com/authorize';

$params = array(
    'client_id'     => $client_id,
    'redirect_uri'  => $redirect_uri,
    'response_type' => 'code'
);

С помощью функции http_build_query, передав туда массив параметров, получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:

echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через ВКонтакте</a></p>';

Также тут я воспользовался функцией urldecode. Если этого не сделать, то в сгенерированной ссылке могут появиться закодированные символы слешей, знаков двоеточия и так далее. Что-то вроде этого:

http://oauth.vk.com/authorize?client_id=3485070&redirect_uri=http%3A%2F%2Flocalhost%2Fvk-auth&response_type=code

Если же мы пропустим данную строку через функцию urldecode, то получим:

http://oauth.vk.com/authorize?client_id=3485070&redirect_uri=http://localhost/vk-auth&response_type=code

Итак, ссылка для аутентификации у нас готова. Если мы сформировали все параметры правильным образом и получили верный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/vk-auth'). Только теперь к этому адресу будет прикреплён специальный параметр code:

// Пример. В вашем случае код будет другой
http://localhost/vk-auth/?code=f30621b146115b3bad

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

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

В первую очередь, снова сформируем нужные нам параметры для этого запроса:

if (isset($_GET['code'])) {
    $params = array(
        'client_id' => $>clientId,
        'client_secret' => $this->clientSecret,
        'code' => $_GET['code'],
        'redirect_uri' => $this->redirectUri
    );
}

Далее нам нужно отправить GET запрос на адрес https://oauth.vk.com/access_token, передав перечисленные параметры. В PHP выполнить GET запрос по какому-то адресу можно несколькими способами. Для данного урока я воспользуюсь функцией file_get_contents.

if (isset($_GET['code'])) {
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );

    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);
}

В результате, при успешном выполнении запроса в переменную $token будет записан ответ от ВКонтакте в JSON формате. Данная строка содержит 3 параметра: access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе, expires_in - время жизни токена, user_id - id пользователя, который прошёл аутентификацию.

{"access_token":"2c6276b767b5e2f35f908e89d61416beea17b6d1ebcd3d14e20ac910281d306bb506ec78e75518ed614e9","expires_in":86399,"user_id":14966712}

Для того чтобы мы далее могли работать с данными параметрами, декодируем JSON строку с помощью функции json_decode и помещаем данные в массив, передав в качестве второго аргумента true.

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

Итак, теперь когда у нас есть параметры access_token и user_id, мы можем сделать запрос к ВКонтакте API и получить информацию о пользователе. Для начала снова подготовим массив с параметрами, которые в последствии превратим в фрагмент url строки.

if (isset($_GET['code'])) {
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );

    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);

    if (isset($token['access_token'])) {
        $params = array(
            'uids'         => $token['user_id'],
            'fields'       => 'uid,first_name,last_name,screen_name,sex,bdate,photo_big',
            'access_token' => $token['access_token']
        );
    }
}

В параметр uids записываем id пользователя; в fields перечисляем через запятую поля, которые хотим извлечь (uid - id пользователя, first_name - имя, last_name - фамилию, screen_name - имя отображаемое на страницах VK, sex - пол, bdate - дату рождения, photo_big - фотографию). Для доступа к большему количеству полей обратитесь к ВКонтакте API users.get. В качестве последнего параметра передаём 'access_token'.

Для получения информации о пользователе сфомированные параметры нам нужно отправить GET запросом по адресу https://api.vk.com/method/users.get.

if (isset($_GET['code'])) {
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );

    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);

    if (isset($token['access_token'])) {
        $params = array(
            'uids'         => $token['user_id'],
            'fields'       => 'uid,first_name,last_name,screen_name,sex,bdate,photo_big',
            'access_token' => $token['access_token']
        );

        $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
    }
}

В результате, если всё было сделано правильно, то получим JSON ответ следующего вида:

{"response":[{"uid":14966712,"first_name":"Стас","last_name":"Протасевич","screen_name":"stanislav.protasevich","sex":2,"bdate":"3.7.1988","photo_big":"http:\/\/cs307601.vk.me\/u14966712\/a_8234a279.jpg"}]}

Снова преобразуем JSON ответ в массив и обратимся к нулевому элементу, хранящемуся в массиве, доступному по ключу response:

if (isset($_GET['code'])) {
    $result = false;
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );

    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);

    if (isset($token['access_token'])) {
        $params = array(
            'uids'         => $token['user_id'],
            'fields'       => 'uid,first_name,last_name,screen_name,sex,bdate,photo_big',
            'access_token' => $token['access_token']
        );

        $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo['response'][0]['uid'])) {
            $userInfo = $userInfo['response'][0];
            $result = true;
        }
    }
}

Прошу обратить внимание, что в данном фрагменте, я добавил специальную переменную $result, равную изначально false сразу же после проверки наличия GET параметра code. Если нам удалось извлечь информацию о пользователе, то мы меняем значение этой переменной на true.

Полный код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
    <title></title>
</head>
<body>
    <?php

    $client_id = '3485070'; // ID приложения
    $client_secret = 'lYjfUZwZmlJJlFIqQFAj'; // Защищённый ключ
    $redirect_uri = 'http://localhost/vk-auth'; // Адрес сайта

    $url = 'http://oauth.vk.com/authorize';

    $params = array(
        'client_id'     => $client_id,
        'redirect_uri'  => $redirect_uri,
        'response_type' => 'code'
    );

    echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через ВКонтакте</a></p>';

if (isset($_GET['code'])) {
    $result = false;
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );

    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);

    if (isset($token['access_token'])) {
        $params = array(
            'uids'         => $token['user_id'],
            'fields'       => 'uid,first_name,last_name,screen_name,sex,bdate,photo_big',
            'access_token' => $token['access_token']
        );

        $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo['response'][0]['uid'])) {
            $userInfo = $userInfo['response'][0];
            $result = true;
        }
    }

    if ($result) {
        echo "Социальный ID пользователя: " . $userInfo['uid'] . '<br />';
        echo "Имя пользователя: " . $userInfo['first_name'] . '<br />';
        echo "Ссылка на профиль пользователя: " . $userInfo['screen_name'] . '<br />';
        echo "Пол пользователя: " . $userInfo['sex'] . '<br />';
        echo "День Рождения: " . $userInfo['bdate'] . '<br />';
        echo '<img src="' . $userInfo['photo_big'] . '" />'; echo "<br />";
    }
}
?>
</body>
</html>

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

Теперь извлекать информацию о пользователе мы можем из массива, хранящегося в переменной $userInfo по ключам uid, first_name, last_name, screen_name, sex, bdate, photo_big.

if ($result) {
    echo "Социальный ID пользователя: " . $userInfo['uid'] . '<br />';
    echo "Имя пользователя: " . $userInfo['first_name'] . '<br />';
    echo "Ссылка на профиль пользователя: ". 'http://vk.com/' . $userInfo['screen_name'] . '<br />';
    echo "Пол пользователя: " . $userInfo['sex'] . '<br />';
    echo "День Рождения: " . $userInfo['bdate'] . '<br />';
    echo '<img src="' . $userInfo['photo_big'] . '" />'; echo "<br />";
}

Шаг 6. Дело за вами

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

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

$_SESSION['user'] = $userInfo;

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

Итог

Вот мы и подошли к концу данного урока, и теперь в ваших руках есть решение, которого вы, возможно, долго ждали. Если вас интересует тема аутентификации через социальные сети, то пишите об этом в комментариях, и я с радостью расскажу и покажу, как работать с Одноклассниками, Google-ом, Facebook-ом и другими сервисами.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.ruseller.com
Автор: Станислав Протасевич
Урок создан: 11 Марта 2013
Просмотров: 231606
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 11 Марта 2013 17:46
    stupidlovejoy
    Очень понравилась статья! Уже делал подобное, только использовал старый API. Нужно использовать https://api.vk.com/method/ в C# из-за этого проблемы (может быть для кого-то важным)! Буду ждать статью про Одноклассники))
  • 11 Марта 2013 19:01
    migalych
    Круто. Полезно. Делайте другие способы. Лишним, уж точно не будет.
  • 11 Марта 2013 19:19
    neve4
    Только вчера мучился с ихним API на JS. Спасибо! Очень полезная статья.
    • 4 Октября 2014 17:31
      asizintsev
      турка безграмотная, слова "ихним" нет! =)
      • 7 Апреля 2016 14:45
        denparf
        Ты чего над ивонным комментарием угараешь??? :)
  • 11 Марта 2013 20:14
    Сердобольный
    Добрый день, на html осуществить можно? Моим хостингом, точнее моим тарифным планом, не предусмотрено пользование php. Урок полезный! Спасибо, ждкм про гугл, и одноклассников.
    • 11 Марта 2013 20:38
      irbissoft
      А зачем тогда вообще авторизация? 0_о
      • 11 Марта 2013 21:31
        ghbrjkbcn
        Меня то-же интересует зачем если сайт впринцапе на html:-))))
        • 11 Марта 2013 21:43
          Ruslaner___
          Эм, я не спец, но думаю что на хтмл вы такого не утворите.
          • 12 Марта 2013 12:43
            bogach
            Можно сделать во первых комментарии, во вторых "эстетика" - приветствие и аватарка (для себя, только владелец на странице будет её видеть). И можно яву подкрутить чтобы поздравляла с днём рождения...а так я тоже не пониямаю какой "полезный" смысл делать это на html. Фотки и профили вы таким образом только через яву сможете сделать, но это во первых файлы защищать надо, да и вообще не безопасно такие штуки делать. !Автору! Хотелось бы видеть отдельный проект, по вживлению по максимуму к Google и Facebook (календари, почта, профили, G+1, коментарии в фасебуке и профили из фасебука на сайте. Буду благодарен и готов помочь. Если Вас не затруднит конечно. Спасибо за урок.
    • 14 Марта 2013 22:08
      Vitalik Shalamay
      жалко 1$ на норм хостинг?
      • 19 Мая 2013 01:47
        paulvonlecter
        А разве дело в хостинге?
  • 12 Марта 2013 01:31
    Anvil
    Есть ли возможность публиковать сообщения на стене пользователя, после данной авторизации? у ФБ такая возможность есть.
    • 12 Марта 2013 11:29
      stas.protasevich
      Судя по документации нет. http://vk.com/developers.php?oid=-1&p=Права_доступа_приложений Цитата: "Доступ к обычным и расширенным методам работы со стеной. Внимание, данное право доступа недоступно для сайтов (игнорируется при попытке авторизации)."
  • 12 Марта 2013 08:56
    igontarev
    это очень интересно, ждем другие социалки
  • 12 Марта 2013 10:26
    Dima_1988
    Помогите пожалуйста! Никак не могу найти статью о создании меню-аккордеона с возможностью прокрутки подпунктов и эффектом отскока при открытии... Дайте ссылочку, я вам буду крайне благодарен!!!
  • 12 Марта 2013 14:12
    lisx
    Я бы на Вашем месте не был так уверен в безоговорочном триумфе соц. Сетей! Потому как умрут они скоро и причин тому, будет множество. Владельцы данных ресурсов еще и не подозревают, во что себя втянули!=) Да и всемирная паутина, примет совсем другие формы! Будет много геморроя, но процесс ,будет интересным! =))
    • 12 Марта 2013 19:11
      iammaster
      ну тогда можешь свой комп вообще нафиг выкинуть, всё равно же рано или поздно ископаемые Земли закончится. Иди закапывайся! :)
      • 14 Марта 2013 16:59
        lisx
        Сынок будешь грубить без повода, трудно будет в жизни! И думаю ты очень скоро их заменишь!=)) Без обид дружище!=))
    • 25 Ноября 2014 19:11
      sumbodee
      вы говорите о блокчейне?))
  • 12 Марта 2013 15:33
    art_gur
    Спасибо админам за данный мануал :)
  • 12 Марта 2013 16:33
    grivachenko
    >публикация таких значений как “Защищённый ключ” КАРАЕТСЯ УДАЛЕНИЕМ вашего приложения или УЧЁТНОЙ ЗАПИСИ в целом. лол.
    • 21 Января 2015 11:36
      Максим Мурич
      В статье указано что ключ левый.
  • 13 Марта 2013 14:54
    ochumelec
    Спасибо, очень полезный урок, думаю ещё не раз пригодится, единственное чего не хватает, как эти значения записать в базу? и ещё очень хотелось бы урок по оплате через приват24, заранее спасибо!
  • 16 Марта 2013 01:49
    DmitrySmor
    echo "Email пользователя: " . $userInfo['last_name'] . '<br />';
    в этом коде ошибка, Email в доккументах по методу users.get НЕТ(А жаль!), тогда нет смысла устанавливать вход на сайт через ВКОНТАКТЕ!
  • 19 Марта 2013 13:48
    Станислав Бабич
    Очень хотелось бы увидеть в вашем цикле статей статью про авторизацию через Facebook. Хочу сделать собственный виджет/сервис авторизации через соц.сети для использования в своих проектах, только инфы про facebook не хватает. А в целом спасибо большое за эти статьи!
  • 23 Марта 2013 22:22
    alex_4569
    Ошибка Warning: file_get_contents(http://oauth.vk.com/access_token?client_id=3514309&client_secret=AaYFfykL2l6l2Xjuf6F&code=2751d0ddbdb6e04921&redirect_uri=http://localhost/beautiful-day) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in Z:\home\localhost\www\beautiful-day\views\pages\index.php on line 26 в 26 линии переменнная $token все делал как на сайте
    • 24 Марта 2013 10:09
      stas.protasevich
      если делаете всё пошагово, НЕ обновляйте страницу через F5. Для проверки функционала нажимайте на ссылку "Аутентификация через VK". Если вы просто обновляете страницу, то некоторые данные остаются такими же как и при предыдущих запросах. В результате ВК не отправляет ответ и функция file_get_contents выкидывает warning. Так же, чтобы этого избежать можно делать GET запрос через CURL.
  • 27 Марта 2013 15:50
    valbars
    Я в php почти не шарю, у меня вот такой вопрос, как мне реализовать на php такую проверку: Если пользователь авторизовался через ВК, то подставлять ему емаил ababagalamaga@trololo.com. Просто у меня на сайте есть обязательное подтверждение email а мне нужно чтоб если вошел через ВК - не подтверждать емаил.
    • 29 Марта 2013 10:36
      mierz
      У тебя в бд существует поле которое отвечает за активацию почты, оно имеет значение. Разберись где оно находится и в код из этого урока добавь sql запрос на изменение значения. Вот вся реализация твоей задачи
      • 29 Марта 2013 18:21
        bogdan24
        У тебя в бд существует
  • 6 Апреля 2013 22:22
    Arat_Kiev
    Ребятки все хорошо, но в базу email не записывает ((( У всех такое?
    • 7 Апреля 2013 08:50
      stas.protasevich
      Не все соц сети предоставляют email пользователя. И не у всех пользователей email вписан в настройках той или иной соц сети. Причины могут быть разные.
  • 10 Апреля 2013 22:31
    kirill_web
    При клике на "Аутентификация через ВКонтакте" Warning: file_get_contents() [function.file-get-contents]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? in Z:\home\localhost\www\vk-auth\index.php on line 34 Warning: file_get_contents(https://oauth.vk.com/access_token?client_id=3563440&client_secret=l8Zo3MxE3e3j6hwJNvna&code=8ad4dcbe866f9ae9ec&redirect_uri=http://localhost/vk-auth/) [function.file-get-contents]: failed to open stream: No error in Z:\home\localhost\www\vk-auth\index.php on line 34
    • 10 Апреля 2013 23:21
      stas.protasevich
      Это больная тема денвера. Денвер - очень урезанная сборка. Слишком урезанная. Если не хотите кучу проблем, переходите на другие сборки (WAMP, XAMPP, Zend Server). Для решения проблемы внимательно читайте ошибку:
      Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?
      Вам необходимо подключить поддержку работы https.
    • 3 Июля 2013 13:37
      dobrodey
      найди файл php.ini (он лежит c:\WebServers\usr\local\php5\) и расскоментируюй строчку убрав ";" перед стройкой ;extension=php_openssl.dll. Должно быть так extension=php_openssl.dll
  • 28 Апреля 2013 21:34
    Кирилл Секретов
    loginza.ru - это система идентификации, обеспечивающая единый доступ к популярным WEB-сервисам. яндекс этот полезный сервис купил. на ютубе можно найти видеоурок по установке этого сервиса на свой сайт.
    • 28 Апреля 2013 21:39
      stas.protasevich
      Всегда можно воспользоваться готовыми сервисами. Другое дело знать как подобный сервис сделать самому.
  • 30 Апреля 2013 14:39
    lytvynov91
    У меня не вышло, выдает ошибку
    Warning: file_get_contents() [function.file-get-contents]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? in Z:\home\vk\www\index.php on line 34
    Подскажите как исправить?!
    • 30 Апреля 2013 16:49
      stas.protasevich
      Отсутствует или не активировано расширение php_openssl
  • 30 Апреля 2013 16:23
    lytvynov91
    + к предыдущему посту : я использую wamp последней версии
    • 30 Апреля 2013 16:50
      stas.protasevich
      в WAMP можно активировать php_openssl (если оно установлено, думаю да) через значёк WAMP в углу экрана. Там есть разные опции. Нужно чтобы напротив php_openssl или похожего названия стояла галочка.
      • 1 Мая 2013 15:10
        lytvynov91
        да, все вышло, спасибо огромное!
  • 5 Мая 2013 19:20
    KEHT
    В чем может быть проблема? Warning: file_get_contents(https://oauth.vk.com/access_token?client_id=3626501&amp;client_secret=54ee48HCBUo1T4OjkMi0&amp;code=64696153609758aa11&amp;redirect_uri=http://localhost/) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized in W:\domains\chat\index.php on line 34
    • 5 Мая 2013 21:16
      stas.protasevich
      почитайте все комменты. ответ найдёте
      • 5 Мая 2013 22:43
        KEHT
        Ответ нашел. Применил CURL. Ошибка пропала. Но данные с ВК не приходят... Хотя по инструкции делал.
        • 5 Мая 2013 23:07
          stas.protasevich
          странно. может настройки приложения не верны.
  • 16 Мая 2013 17:22
    raparti
    Здравствуйте, спасибо за урок, все работает. Но как я понял Open API очень ограничен. Вообщем мне нужно узнать например есть ли пользователь в группе или нет или поставил ли он лайк. Как это реализовать ?
    • 16 Мая 2013 19:47
      stas.protasevich
      Нужно покопаться в ВК API. Возможно там есть нужные вам функции. Но так же нужно как-то получить разрешение от пользователя о доступе к его группам. Для этого надо расширять значение scope.
  • 28 Мая 2013 09:49
    Вова Пекун
    Здравствуйте. Я не сильно разбираюсь в php. Помогите разобраться со следующей проблемой: я добавил код с 09 строки по 59 в форму комментариев wordpress (файл comment-template). Ссылка авторизации в форме появилась. Я подставил свой Id и заменил redirect url на главную страницу своего сайта. Теперь при нажатии на ссылку авторизации меня просто переводит на главную страницу без всякой авторизации.
    • 28 Мая 2013 13:48
      stas.protasevich
      В форме нужно только вставить ссылку. А обработку вывести в отдельный файл. Если вы делаете для Wordpress, то лучше поищите сторонние плагины, потому что если вы не разбираетесь в PHP, то навряд ли у вас получиться внедрить систему.
      • 28 Мая 2013 14:44
        Вова Пекун
        Спасибо за совет.
  • 6 Июля 2013 23:00
    Володимир Пасіка
    Я вот пробовал получить email но не могу, всеми вариантами авторизации, зато вижу что у afisha.ru есть получение мейла, как такое можеть быть? избраные сайты получают такую возможность.
    • 11 Июля 2013 12:13
      Віталій Гордій
      Щось в php не так.
  • 14 Июля 2013 17:58
    SevenPC
    что-то после получения кода, информацию о пользователе не выводит
  • 30 Июля 2013 12:20
    Джамал Азизов
    А email как можно забрать, имя фамилия фото id все понятно, а email как затащит в переменную!??
  • 11 Августа 2013 15:31
    Hjccbzyby
    Я столкнулся вот с какой проблемой - всё работает как надо и не на локальном хосте, а на реальном, но при ответе от ВКонтакте теряется сессия! До отправки у меня авторизуется (ну там логин, пароль и емаил-адрес забивает, а дальше, в ЛК я предлагаю авторизоваться вКонтакте и подтвердить имя, фамилию и.т.д., ответ приходит на страницу, но сессия теряется и чтобы полученные данные от ВКонтакте привязать к пользователю, мне снова приходится его просить авторизоваться на сайте повторно! И почему это так? JSON ответ перебивает сессию или что?
  • 13 Августа 2013 16:37
    formovsky
    Отличная статья. А можно сделать то же самое без клика по ссылке "Аутентификация через ВКонтакте", т.е. отправить запрос, например, при помощи cURL? И как в этом случае обработать ответ от Вконтакте, который приходит в виде url?
  • 19 Августа 2013 15:37
    mastermind
    Не работает $redirect_uri - уже несколькими разными способами делал, суть какая указываю имя домена в приложении, указываю имя домена в $redirect_uri - но после авторизации вконтакте не редиректит на старницу указанную в $redirect_uri, а остаётся у себя с созданным кодом типа https://oauth.vk.com/access_token?client_id=3817191&client_secret=umfErs2QUerkxD1vCZ5j&code=a3c7ff4d3d5a977b51&redirect_uri=(название сайта)
  • 26 Сентября 2013 13:01
    alex.middle.92
    А как я могу получить информацию о пользователе ВК через его email? Что то во всех примерах UID.
    • 26 Сентября 2013 14:13
      stas.protasevich
      не все соц сети дают email. ВК вроде не даёт
  • 7 Октября 2013 11:53
    mr.seriycoder
    А подскажите, возможно ли веб-приложению получить доступ к списку видеозаписей вк? При попытке запроса к video.get выводит следующее: error_code => 7 error_msg => Permission to perform this action is denied Я так понимаю у приложения нет прав на получение информации о видеозаписях, а в настройках самого приложения я не обнаружил галочек доступа. Я должен это программно чтоле сделать?
    • 7 Октября 2013 13:29
      stas.protasevich
      возможно, но при авторизации нужно запросить на это права, точно не могу сказать...
  • 11 Октября 2013 16:39
    Колдун
    Классный урок, Спасибо большое!
  • 12 Октября 2013 14:56
    inspectors
    статья классная, только у меня не получается пройти аутентификацию, и всегда выдает 400 ошибку или предлагает сохранить файл authorize
  • 17 Октября 2013 18:32
    cript
    У меня почему то не работает, испробовал все что можно, но после нажатия на кнопку "разрешить" переадресовывает на станицу https://oauth.vk.com/err400.html ... Что можно с этим сделать?
    • 17 Октября 2013 22:41
      stas.protasevich
      скорее всего, дело в неправильных данных, которые вы указываете
  • 18 Октября 2013 00:04
    cript
    Что тут может быть неправильно? Пример ссылки: http://oauth.vk.com/authorize?client_id=3938440&redirect_uri=http://www.---.ru/login.php?m=vk&response_type=code&scope=photos На странице приложение запрашивает доступ, все ок, нажимаю "разрешить" - выдает ошибку.. Еще заметил, если в конце не указывать scope (а в данном исходнике он не указан) то переадресовывает сразу на ошибку без запроса доступа: https://oauth.vk.com/err400.html
    • 19 Октября 2013 00:34
      inspectors
      у меня тоже самое происходит
      • 28 Октября 2013 23:24
        varse
        Столкнулся с ошибкой https://oauth.vk.com/err400.html Помогло отключение плагина, работавшего параллельно - "Login With Ajax".
  • 28 Октября 2013 15:35
    Иван Текунов
    Классная статья
  • 22 Ноября 2013 12:55
    axeld
    Как сделать редирект не на главную страницу пример "http://localhost/vk-auth" на другие, от куда нажали ссылку?
  • 26 Ноября 2013 01:20
    mihdan
    Станислав, есть ли возможность получить email пользователя, как это делает, например, afisha.ru. Об этом в официальном руководстве ничего не написано
    • 26 Ноября 2013 18:56
      stas.protasevich
      Мне это неизвестно...
    • 10 Января 2014 13:57
      lazyproger
      При авторизации просмотри что запрашивает сервис
  • 4 Декабря 2013 22:49
    apuc
    Здравствуйте. Подскажите пожалуйста, сделал все как в Вашем уроке, после перехода по ссылке переходит на страницу http://oauth.vk.com/err400.html В чем может быть проблема? Может ли быть проблема в том, что скрипт лежит на поддомене? http://rasp.buy-best.dn.ua/main/vk
    • 5 Декабря 2013 00:23
      stas.protasevich
      Возможно. Главное правильно сконфигурировать адреса в настройках приложения.
  • 8 Декабря 2013 22:32
    artyom_shaitor
    Добрый вечер! Есть проблема в file_get_contents(url). Суть в том, что функция не делает ничего. Вообще. Даже ошибок не выводит. Пытался реализовать с помощью cURL - абсолютно то же самое. Если это имеет значение, то сервер не локальный.
    • 10 Января 2014 13:56
      lazyproger
      Показ ошибок включи
  • 16 Декабря 2013 05:09
    Денис Лищенко
    Колупаю этот скрипт уже 3 часа. И через curl, и с хостерами говорил, и на локалке тестил. Вроде и руки не кривые. Интересно то, что еще никто не отписал "ура, поставил это себе" или "у меня вышло".
  • 17 Декабря 2013 14:20
    Павел Московских
    Спасибо за статью! Немножко понимания авторизации через соц сети появилось. Скрипт работает. И на локальной денвере и на хостинге. Правда локальный денвер отказался через curl работать. Застряло где-то на этапе $res = curl_exec($ch); Возвращает пустоту, хоть ты тресни и все. Доп библиотеки подключил, php_curl.dll и php_openssl.dll комментарии убрал, перезапускался, ничего не помогает. Но это уже к денверу и настройкам локального сервера вопрос. На хостинге все работает и через curl тоже.
  • 20 Декабря 2013 15:20
    dimkaskv
    Добрый день! http://streetmeet.ru/vk/index.php Почему-то не выходит, при нажатии перекидывает на авторизацию и после сразу на сайт, не показывая echo из конца скрипта...все вроде работает корректно, но как увидеть токен и т.п. чудеса?
  • 30 Декабря 2013 00:02
    Павел Московских
    Всем привет! Организовать авторизацию на своем сайте через VK можно двумя способами. С помощью OAuth http://vk.com/dev/auth_sites И с помощью виджета http://vk.com/dev/Auth Подскажите, пожалуйста, различия между этими двумя способами. И какой более предпочтителен для реализации аутентификации с занесением пользователя в свою базу данных юзеров.
  • 12 Января 2014 16:00
    Tabrat
    Здравствуйте! Извините, но возможно кто-то мне поможет. Есть такая программа VKSkypes, которая ищет Skype-контакты в любой группе Vkontakte. но она перестала работать. Выдает при обновлении окна программы: "не удалось загрузить authorize из oauth.vk.com", т.е. программа ссылается на адрес в Vkontakte:oauth.vk.com так как по этому адресу программа авторизуется. Сейчас адрес этот недоступен. Скорее всего, в программу нужно внести новый такой адрес? Или есть иное рещение этой проблемы? Помогите, пожалуйста. Лучше на nikls212@gmail.com
  • 7 Февраля 2014 17:36
    IBRA CHEKAEV
    не показывает результат
  • 22 Марта 2014 21:22
    vinnikovalexey
    А как получить мини фото?
    • 22 Апреля 2014 19:30
      nagelvyacheslaw
      Просто через html необходимо в теге <img> задать размеры изображения
    • 21 Мая 2014 22:19
      Рома Бурцев
      вот список всех полей https://vk.com/dev/users.get напр. photo_50
  • 21 Мая 2014 21:01
    Рома Бурцев
    Спасибо! очень доступно объяснено
  • 27 Июня 2014 21:47
    grok1
    Все получилось! Спасибо огромное! В Denwer отказывался работать скрипт из-за урезанной функции file_get_contents(), но на XAMPP-сервере все замечательно!
  • 7 Июля 2014 20:08
    andrey_puershop
    Отличная статья!
  • 13 Июля 2014 15:44
    glory_to_ukraine01
    привет, можешь сделать статью по проверке лайкнул пользователь или нет и дать ответ
  • 14 Июля 2014 16:58
    glory_to_ukraine01
    а как вытащить hash
  • 12 Сентября 2014 18:07
    VergKos
    Сделал все как в статье. Работает только для моей страницы... Если зайти с любого другого аккаунта - пишет Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов. Таким образом Вы можете потерять доступ к Вашему аккаунту. Кто то встречал подобное?
    • 13 Сентября 2014 19:26
      stas.protasevich
      Вы скорее всего пытаетесь запросить данные, которые доступны только определённому числу приложений. Какие права вы запрашиваете при авторизации?
  • 25 Сентября 2014 01:20
    No Name
    помогите пожалуйста записать полученные данные в базу, вот мой запрос но он не работает и куда мне его всавить?
    $mysqli=mysqli_connect('localhost','root','','priz');
    $query='INSERT INTO user (uid,first_name,last_name,screen_name,photo_big) VALUES ("'.$userInfo['uid'].'","'.$userInfo['first_name'].'","'.$userInfo['last_name'].'","'.$userInfo['screen_name'].'","'.$userInfo['photo_big'].'")';
    $res=mysqli_query($mysqli,$query);
    • 27 Ноября 2014 11:26
      Геннадий Опарей
      что пишет сиквел?
  • 25 Ноября 2014 19:04
    sumbodee
    Автор вводит людей в заблуждение и тратит чужое время, очередной неграмотно написанной статьёй, если вам действительно нужно решить задачу по встраиванию авторизации ВК, лучше поискать другой материал Объясню почему, на этапе вводе кода:
    if (isset($_GET['code'])) { $params = array( 'client_id' => $>clientId, 'client_secret' => $this->clientSecret, 'code' => $_GET['code'], 'redirect_uri' => $this->redirectUri
    );
    }
    Появляется ошибка: Parse error: syntax error, unexpected '>', expecting T_VARIABLE or '$' in /home/u716396316/public_html/vk-auth/index.php on line 5 Т.е. ошибка в синтаксисе
  • 27 Ноября 2014 11:11
    Геннадий Опарей
    Тот же вопрос. Не отдается email:( Это поле критично для меня. Можно ли кусок рабочего примера?
  • 19 Декабря 2014 17:34
    aleksei.jegorov.5
    Спасибо за хорошую статью. У меня вопросв продолжение темы. Ведь после авторизации порой нужно использовать и некоторые другие часто используемые функции. Самый тупик у меня возник при попытке отправить сообщение другу или сделать sendNotification. Ведь это же социальная сеть! Поэтому функция общения друзей друг с другом является обычным делом. Может кто выскажется по поводу метода: messages.send
  • 12 Января 2015 17:16
    Саша Федоров
    Спасибо за статью. Но у меня проблема. Делаю все, как здесь написано, но регистрации не происходит, при этом в адресной строке добавляется содержимое переменной code. Подскажите, пожалуйста, в какую сторону копать? Заранее спасибо!
    • 20 Января 2015 23:37
      stas.protasevich
      Или неправильные настройки в приложении вк и в php либо curl расширение не работает
  • 24 Февраля 2015 12:05
    Сергей Савкин
    кому нужен Email для VK: в файл /lib/SocialAuther/Adapter/Vk.php 1. добавляем функцию: public function getEmail() { $result = null; if (isset($this->userInfo['email'])) $result = strtolower($this->userInfo['email']); return $result; } 2. делаем вот так в функции public function authenticate() if (isset($userInfo['response'][0]['uid'])) { $this->userInfo = $userInfo['response'][0]; $result = true; } меняем на: if (isset($userInfo['response'][0]['uid'])) { $userInfo['response'][0]['email'] = $tokenInfo['email']; $this->userInfo = $userInfo['response'][0]; $result = true; } 3. добавляем в scope параметр для функции public function prepareAuthParams() 'scope'=> 'notify,email', 4. в основном коде, где получаем данные после if($auther->authenticate()) можно сделать так: $EMAIL = $auther->getEmail(); if(!$EMAIL){header("Location: /");die();}
  • 1 Марта 2015 11:59
    Дмитрий Сметюхов
    Благодарствую! :)
  • 14 Марта 2015 19:34
    Сергей Удовиченко
    Большое спасибо, я очень долго хотел реализовать себе такую уатентификацию!
  • 6 Апреля 2015 17:35
    maGGo
    Выдает ошибку: Warning: file_get_contents() [function.file-get-contents]: Couldn't connect to server in /localhost/index.php on line 43 Что делать?
  • 23 Мая 2015 15:56
    new_forward
    Доброго времени суток, скажите как сделать автоматическое получение CODE ? он же постоянно меняется при обновлении. Через курл не могу получить конечный урл с CODE, но страницу выводит.
  • 27 Мая 2015 12:49
    zozo13
    а как сделать авторизацию wi-fi через соц сети также извлекая данные Имя фамилию возраст пол
  • 6 Июля 2015 00:53
    kirill_kuts
    Огромное спасибо, парни! Случайно нарыл статью в интернете, то что нужно! Огромнейшие спасибо!
  • 20 Июля 2015 07:44
    Алексей Бажура
    Круто
  • 20 Августа 2015 01:48
    dastan_smailov
    У меня не получается Внимание: не удалось открыть поток: Подключение отказано в /home/u804075797/public_html/index.php на линии 43
    $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
  • 3 Сентября 2015 20:37
    alexandr89
    Все сделал, но все это внедрить в сайт, может кто поможет? меня кидает на страницу 404, Пользуюсь InstantCMS 2
  • 10 Октября 2015 12:10
    den_pro8
    Warning: file_get_contents(https://api.vk.com/method/users.get?uids=81812054&fields=uid,first_name,last_name,screen_name,sex,bdate,photo_big&access_token=3e6863cb638b39fc35026d9912cd923c9924026dd17fc1469752f653c2024f9775a5f9351d644c70cf408): failed to open stream: Connection refused in /home/u720415965/public_html/index.php on line 465 Перехожу по ссылке {"response":[{"uid":81812054,"first_name":"Ден","last_name":"Абашин","sex":2,"screen_name":"den.abashin","bdate":"29.1.1990","photo_big":"http:\/\/cs622928.vk.me\/v622928054\/41fb5\/wEGIauMwfFU.jpg"}]} Вопрос Как у вас срабатывает открытие модального окна и регистрация через в контакте, что за ошибка у меня? С чем связанно, как исправить?
    • 20 Октября 2015 23:29
      stas.protasevich
      Проверьте наличие активного расширения curl в php.ini
  • 30 Октября 2015 15:17
    evgeniy_marchuk
    При обновлении страницы все данные исчезают(
  • 26 Марта 2016 11:57
    Бася Эвердинг
    Было бы еще расписано для чайников(((у меня на сайте есть авторизация, но через обычный скрипт http://klondaikr.ru, а вот дальше не могу сообразить сделать например список тех кто сделал репост, чтобы люди были уверены в том что участвуют в акции. Сайт на вордпрессе.
  • 28 Марта 2016 01:32
    Algoritm
    Как получить email пользователя?
    • 12 Июля 2016 08:01
      newbie67
      Никак. https://new.vk.com/dev/fields
      • 13 Июля 2016 12:21
        stas.protasevich
        Email можно запросить на этапе получения прав, перечислив его вместе с такими правами как wall... В этом случае email получается вместе с токеном
  • 25 Мая 2016 18:07
    Valentin
    Подскажите пожалуйста как сделать аутентификацию через учетную запись Windows?
  • 12 Июля 2016 07:54
    newbie67
    Кто-нибудь объяснит мне, зачем тут повсеместно используется urldecode() ????
    • 13 Июля 2016 12:22
      stas.protasevich
      На всякий случай :-) Иногда могут попадаться символы, которые следует декодировать.
  • 15 Июля 2016 02:05
    Влад Жуков
    Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры: view sourceprint? 1 $url = 'http://oauth.vk.com/authorize'; 2 3 $params = array( 4 'client_id' => $client_id, 5 'redirect_uri' => $redirect_uri, 6 'response_type' => 'code' 7 ); у меня проблема в этом как тут разобратся
    • 17 Июля 2016 22:30
      stas.protasevich
      В чём проблема?
  • 1 Августа 2016 22:34
    zageorge161297
    Найдите ваш userID по этой ссылке http://vkuid.com/
  • 19 Сентября 2016 00:02
    valeriy42
    Пожалуйста обновите статью, все слишком сильно поменялось. К тому же с file_get_contents() у меня сервер почему-то на отрез отказывается работать, хотя в настройках все включено. Пришлось поменять на curl_init, и только после этого я смог получить json ответ, однако я почему-то не могу его загнать в массив при помощи json_decode. Попробовал просто вывести результат на экран, я этот результат вставил в тестовую переменную, и прогнал через json_decode(), он ее в массив загнать смог, а вот сразу полученный ответ не хочет. Хз чо делать, нигде не могу найти ответ.
^ Наверх ^