Совсем недавно обнаружил замечательный ресурс с практически ценными заметками по web-программированию itlessons.info. Для оценки этой значимости делаю перепечатку статьи о механизмах OAuth 2.0, которые много чего позволяют в том числе и делать регистрацию на своих ресурсах, используя социальные сети.
Регистрация и авторизация на сайте очень важны и должны быть хорошо проработаны как разработчиком, так и проектировщиком. Одной из задач, которые встают перед ними является использование данных из популярных социальных сетей. При этом важно сохранить баланс и адекватность. Ведь с одной стороны пользователь ленив и не против, чтобы его данные использовались на стороннем сайте без необходимости их вводить, но с другой — он может не доверять сайту и не хочет сообщать какие-либо лишние данные, запрошенные приложением. Например, информацию о друзьях, доступ к заметкам и так далее. В этой статье мы поговорим о процессе получения данных из социальных сетей.
Процесс получение данных из социальной сети происходит обычно с использование открытого протокола авторизации OAuth 2.0, который позволяет без необходимости предоставления третьей стороне (нашему сайту) логина и пароля, получать ограниченный доступ к пользовательским ресурсам. Происходит это следующим образом:
- Сайт перенаправляет пользователя на специальную страницу в социальной сети, указывая в параметрах права на какую информацию необходимы
- На этой странице пользователь авторизовывается, если необходимо.
- После авторизации пользователю разъясняется права запрашивемые сайтом, а также спрашивается его разрешение
- В случае согласия, пользователь перенаправляется на сайт с специальным идентификатором, с помощью которого сайт может получить авторизационный токен
- С помощью этого токена и делаются запросы к api социальной сети
- При повторной авторизации этап подтверждения прав пропускается за ненадобностью
В социальной сети необходимо создать приложение, идентификатор и секретный ключ которого будут использоваться при запросе токена в качестве параметров client_id и client_secret.
Использование OAuth 2.0 протокола удобно, но в реальном мире есть проблемы. Все социальные сети реализуют данный протокол по разному. Общая концепция сохраняется, но существуют различия, из-за которых приходится писать довольно много кода.
Специально для статьи была написана библиотека, позволяющая производить авторизацию в социальных сетях без сложностей. С помощью нее разработчику будет проще разобраться с данной темой. Использовать библиотеку просто.
Первым делом формируем ссылку и перенаправляем пользователя в социальную сеть.
//auth_callback.php $auth = new \Social\Auth\AuthVk($APP_ID_VK, $APP_SECRET_VK, $APP_SCOPE_VK); $token = $auth->authenticate($_REQUEST, $REDIRECT_URL_VK); //call api with access_token $api = new \Social\Api\ApiVk($token); $user = $api->getProfile(); // use or save user object // $user->id // $user->firstName // $user->lastName // $user->nickname // $user->screenName // $user->photoUrl // $user->photoBigUrl // ...
После подтверждения прав пользователь перенаправляется на redirect_url, в котором сайт запрашивает токен и производит первый запрос к api социальной сети, получая информацию о пользователе.
//auth_callback.php $auth = new \Social\Auth\AuthVk($APP_ID_VK, $APP_SECRET_VK, $APP_SCOPE_VK); $token = $auth->authenticate($_REQUEST, $REDIRECT_URL_VK); //call api with access_token $api = new \Social\Api\ApiVk($token); $user = $api->getProfile(); // use or save user object // $user->id // $user->firstName // $user->lastName // $user->nickname // $user->screenName // $user->photoUrl // $user->photoBigUrl // ...
Как видно все просто. Библиотека берет на себя все сложности.
На момент написания статьи в библиотеке реализована авторизация в социальных сетях Вконтакте, Моем мире и Facebook. Но можно с легкостью реализовать поддержку и других социальных сетей. Библиотека находится на githup и будет постепенно развиваться. Любой желающий может поучаствовать в ее развитии.
Для более глубокого понимания данной темы скачайте исходный код и разберите его. В нем даны ссылка для дальнейшего изучения.
UPD:
Вариант реализации для nodejs и passportjs тут.