Реклама
timeweb
falbar Аутентификация через «ВКонтакте»

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

2 декабря 2014 3860 0

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

Реклама

Итак, приступим к технический части. Для этого мы создадим и настроим новое приложение в социальной сети. После чего напишем класс, который будет взаимодействовать с API «ВКонтакте»: устанавливать соединение и получать данные о пользователе. В результате проделанных действий, мы сможем авторизовать пользователя у себя на сайте.

Создаём новое приложение «ВКонтакте»

Перед тем, как писать код, нам нужно зарегистрировать новое приложение. Делается это просто, заходим в свой профиль, переходим в раздел приложения и в нем кликаем на кнопку «Управление». В этом разделе вы увидите список всех приложений, которыми вы пользуетесь и кнопку «Создать приложение», жмём по ней. Заполняем название и выбираем пункт «Веб-сайт».

sozdanie-novogo-prilozheniya-vkontakte

После этого появятся два новых поля, которые также заполняем и жмём «Подключить сайт». В следующем окне вам останется подтвердить регистрацию.

podtverzhdenie-registratsii-prilozheniya-vkontakte

Вот так просто и быстро регистрируется новое приложение «ВКонтакте». Теперь переходим в настройки и копируем ID приложения и защищенный ключ в блокнот. На этом работа с социальной сетью заканчивается.

nastrojka-prilozheniya-vkontakte

Пишем класс для работы с API

Перед тем, как написать класс, мы определим его логику, которая будет содержать 3 свойства и 3 метода (включая конструктор).

class VKAuth{

	public $settings    = array();
	public $auth_status = false;
	public $user_info   = array();

	public function __construct($settings){

	}

	public function auth($code){

	}

	public function get_link(){

	}
}
  • settings – отвечает за хранение настроек для подключения к API;
  • auth_status – статус аутентификации, если пользователь пройдет, то значение изменяться на true;
  • В конструкторе мы будем принимать настройки для подключения, и сохранять в переменную settings;
  • auth – метод, который будет производить соединение с API и вытягивать нужные нам данные (принимает код для получения ключа доступа);
  • get_link – метод генерирующий путь ссылки для аутентификации.

Теперь давайте рассмотрим каждый из методов подробно:

1. Конструктор:

Как и было раннее оговорено, мы принимаем настройки и сохраняем их в переменную settings. Для надёжности проверяем наличие их при помощи функции isset().

public function __construct($settings){

	if(isset($settings["client_id"], $settings["client_secret"], $settings["redirect_uri"])){

		$this->settings = $settings;
	}
}

2. Auth:

С начала мы проверяем наличие переменных code и settings. Если всё нормально, то формируем первый запрос, который будет состоять из массива данных, обёрнутых в две функции.

urldecode() – декодирует %## символы в url.

http_build_query() – генерирует строку запроса.

После того, как мы обратимся по сформированному адресу, нам в ответ придет json строка. Для удобства, получаемые данные мы преобразуем в массив, делается это путем передачи у функции json_decode() второго параметра true. Данный массив будет содержать три ячейки: access_token, expires_in и user_id.

Идём дальше, проверяем наличие токена и формируем новый запрос на получение данных пользователя. В нашей функции мы будем сохранять: id, имя, фамилию и аватарку. Для этого через запятую в ячейку fields поместим строку с параметрами «uid,first_name,last_name,photo_100». Какие ещё данные пользователя можно получить описаны в документации объекта user. Обращаемся по новой ссылке и получаем ответ в виде массива. Проверяем наличие принятых данных и сохраняем их в переменную user_info (принятый массив является многомерным, данные будут храниться в нулевой ячейке response), а так же значение auth_status меняем на true и возвращаем true.

public function auth($code){

	if($code && $this->settings){

		$query = urldecode(http_build_query(array(

			"client_id"	  => $this->settings["client_id"],
			"client_secret"   => $this->settings["client_secret"],
			"code" 	          => $code,
			"redirect_uri"    => $this->settings["redirect_uri"]
		)));

		$token = json_decode(file_get_contents("https://oauth.vk.com/access_token?".$query), true);

		if(isset($token["access_token"])){

			$query = urldecode(http_build_query(array(

				"uids"         => $token["user_id"],
				"fields"       => "uid,first_name,last_name,photo_100",
				"access_token" => $token["access_token"]
			)));

			$this->user_info = json_decode(file_get_contents("https://api.vk.com/method/users.get?".$query), true);

			if(isset($this->user_info["response"][0]["uid"])){

				$this->user_info = $this->user_info["response"][0];
				$this->auth_status = true;

				return true;
			}
		}
	}

	return false;
}

3. Get Link:

Первым делом проверяем наличие настроек, а далее формируем путь для ссылки. Функции, которые используются, описаны выше. Когда пользователь нажмёт на ссылку с этим путём, то его перебросит на страницу c параметром code в адресной строке – код для получения токена.

public function get_link(){

	if($this->settings){

		$query = urldecode(http_build_query(array(

			"client_id"     => $this->settings["client_id"],
			"redirect_uri"  => $this->settings["redirect_uri"],
			"response_type" => "code"
		)));

		return "https://oauth.vk.com/authorize?".$query;
	}

	return false;
}

Простая авторизация

На этом этапе – всё довольно рационально. После того как вы подключите класс к файлу, останется получить экземпляр VKAuth, передав ему настройки. Ниже описываем простой обработчик, который отлавливает переменную $_GET[code] и проверяем аутентификацию.

require_once("VKAuth.php");

$vk  = new VKAuth(array(

	"client_id"     => "ID_приложения",
	"client_secret" => "защищенный_ключ",
	"redirect_uri"  => "адрес_сайта"
));

if(isset($_GET["code"])){

	if($vk->auth($_GET["code"])){

		// Делаем свои дела
	}
}

Далее, чтобы произвести авторизацию, вам нужно будет проверить наличие пользователя у себя в базе данных и, если его нет, то добавить. В противном случае обновить его данные (перед обновлением желательно проверить - изменились ли они). Касательно базы данных обычно добавляют два поля: тип авторизации и id пользователя в социальной сети. Вот так осуществляется аутентификация и авторизация через социальную сеть «ВКонтакте».

В архиве вы найдёте готовый пример работы с классом VKAuth, где выводятся данные пользователя.

Реклама
Комментариев еще не оставлено
no_avatar