Каждый компьютер или другое устройство, выходящее в глобальную сеть, имеет свой уникальный номер, называющийся IP-адресом. С помощью него можно узнать много полезной информации об отправителе. Однако уточнить сам IP бывает не так просто, поскольку он не красуется перед глазами обычного пользователя.
Далее я предлагаю разобраться с методами обнаружения IP-адреса по электронной почте отправителя или почтовому серверу.
Способ 1: Ознакомление с входящим письмом
Аутентификация через Mail.ru
Если кто пропустил предыдущие выпуски, то их можно найти по следующим ссылкам:
- Аутентификация через ВКонтакте
- Аутентификация через Одноклассники
Заметка. Как и в предыдущих статьях, пример, созданный в данном уроке, предназначен для работы на локальном сервере.
Как узнать email пользователя Вконтакте
Шаг 1. Добавление нового приложения
Для начала нам необходимо добавить новый сайт в нашу учётную запись сервиса Mail.ru. Сделать это можно пройдя по вот этой ссылке. Для работы примера вам нужно будет самим зарегистрировать новое приложение и ввести собственные параметры.
На открывшейся странице, в первую очередь, соглашаемся с правилами размещения сайтов. Далее заполняем форму:
Название будет «Mail.ru Auth». Адрес главной страницы — это тот url адрес страницы, где будет внедрён основной функционал: http://localhost/mailru-auth . Таким образом, на локальном сервере поместим наши файлы в каталог «mailru-auth».
Далее нажимаем на кнопку «Продолжить» и переходим к следующему шагу. На третьем шаге необходимо скачать файл receiver.html, поместить его в каталог вашего проекта и дать Mail.ru возможность проверить существование данного файла. Поскольку наш пример предназначен для работы на локальном сервере, то мы этого делать не будем. Просто нажимаем кнопку «Продолжить», и на следующей странице «Пропустить». Если же вы создаёте пример для приложения работающего на каком-то реальном сервере, то сначала пройдите процедуру проверки наличия файла receiver.html, иначе функциональность вашего примера может быть ограничена.
Итак, после успешного добавления сайта в сервис Mail.ru, нам должно выдастся следующее сообщение со специальными параметрами:
Отсюда мы можем извлечь такие параметры, как `ID` приложения, `Приватный ключ` и`Секретный ключ`. Запишем их в специальные переменные в файле index.php:
Шаг 2. Генерация ссылки для аутентификации
Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:
$url = ‘https://connect.mail.ru/oauth/authorize’; $params = array( ‘client_id’ => $client_id, ‘response_type’ => ‘code’, ‘redirect_uri’ => $redirect_uri );
С помощью функции http_build_query, передав массив параметров, мы получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:
Как узнать пароль ВК на телефоне 2021 / Как посмотреть, если забыл?
Тут же, в очередной раз, я воспользовался функцией urldecode. Если этого не сделать, то в сгенерированной ссылке могут появиться закодированные символы слешей, знаков двоеточия и так далее:
https://connect.mail.ru/oauth/authorize?client_id=702253grant_type=authorization_coderedirect_uri=http%3A%2F%2Flocalhost%2Fmailru-auth
Если же мы пропустим данную строку через функцию urldecode, то получим:
https://connect.mail.ru/oauth/authorize?client_id=702253grant_type=authorization_coderedirect_uri=http://localhost/mailru-auth
Ссылка для аутентификации готова. Если мы сформировали все параметры верно и получили правильный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения (‘http://localhost/mailru-auth’). Как и в предыдущих случаях (при работе с Вконтакте и Одноклассниками), к этому адресу будет прикреплён специальный параметр code:
// Пример. В вашем случае код будет другой http://localhost/mailru-auth/?code=5adc5521461df2b28be76b5cfdd6c7e5
Шаг 3. Получение токена
Начинать процедуру аутентификации мы можем в том случае, если к нам пришёл параметр code. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.
В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `client_id` — id приложения; `client_secret` — секретный ключ; `grand_type`, равный значению «authorization_code» — код активации; `code` — url параметр, пришедший от Mail.ru; `redirect_uri` — страница, на которую будет возвращён пользователь:
if (isset($_GET[‘code’])) < $result = false; $params = array( ‘client_id’ =>$client_id, ‘client_secret’ => $client_secret, ‘grant_type’ => ‘authorization_code’, ‘code’ => $_GET[‘code’], ‘redirect_uri’ => $redirect_uri ); $url = ‘https://connect.mail.ru/oauth/token’; >
Далее нам нужно отправить POST запрос на адрес https://connect.mail.ru/oauth/token, передав перечисленные параметры. В PHP выполнить POST запрос можно с помощью создания curl запроса:
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params))); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($curl); curl_close($curl); $tokenInfo = json_decode($result, true);
При успешном выполнении запроса в переменную $tokenInfo будет записан ответ от Mail.ru в JSON формате. Данная строка содержит 5 параметров: refresh token — маркер обновления информации, expires_in — время жизни токена, access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе, token_type — тип токена, x_mailru_vid — id пользователя в системе Mail.ru, который пытается авторизоваться:
Для того чтобы мы далее могли работать с данными параметрами, декодируем JSON строку с помощью функции json_decode и помещаем данные в массив, передав в качестве второго аргумента true.
Шаг 4. Получение информации о пользователе
Теперь, когда у нас есть параметры access_token, мы можем сделать запрос к Mail.ru API и получить информацию о пользователе. Перед тем, как мы подготовим массив с параметрами, которые в последствии превратим во фрагмент url строки, нам нужно сформировать специальную `подпись` запроса $sign с помощью хэша md5;
if (isset($tokenInfo[‘access_token’])) < $sign = md5(«app_id=method=users.getInfosecure=1session_key=»); $params = array( ‘method’ => ‘users.getInfo’, ‘secure’ => ‘1’, ‘app_id’ => $client_id, ‘session_key’ => $tokenInfo[‘access_token’], ‘sig’ => $sign );
В параметр method записываем название метода Mail.ru API, который вернёт нам информацию о пользователе; параметру secure ставим 1 — это нужно для безопасности. Далее в параметр app_id передаём id нашего приложения; в session_key записываем access_token — токен доступа, который мы достали по POST запросу в предыдущем шаге и конечно же подпись запроса (sig).
Для получения информации о пользователе сформированные параметры нам нужно отправить GET запросом по адресу http://www.appsmail.ru/platform/api:
$params = array( ‘method’ => ‘users.getInfo’, ‘secure’ => ‘1’, ‘app_id’ => $client_id, ‘session_key’ => $tokenInfo[‘access_token’], ‘sig’ => $sign ); $userInfo = json_decode(file_get_contents(‘http://www.appsmail.ru/platform/api’ . ‘?’ . urldecode(http_build_query($params))), true);
В результате, если всё было сделано успешно, то получим JSON ответ приблизительно следующего вида:
Далее преобразуем JSON ответ в массив и проверим наличие в нём нулевого элемента с ключом uid. Если такой элемент есть, извлечём его из общего массива $userInfo с помощью метода array_shift:
if (isset($userInfo[0][‘uid’]))
$client_id, ‘response_type’ => ‘code’, ‘redirect_uri’ => $redirect_uri ); echo $link = ‘
Аутентификация через Mail.ru
‘; if (isset($_GET[‘code’])) < $result = false; $params = array( ‘client_id’ =>$client_id, ‘client_secret’ => $client_secret, ‘grant_type’ => ‘authorization_code’, ‘code’ => $_GET[‘code’], ‘redirect_uri’ => $redirect_uri ); $url = ‘https://connect.mail.ru/oauth/token’; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params))); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($curl); curl_close($curl); $tokenInfo = json_decode($result, true); if (isset($tokenInfo[‘access_token’])) < $sign = md5(«app_id=method=users.getInfosecure=1session_key=»); $params = array( ‘method’ => ‘users.getInfo’, ‘secure’ => ‘1’, ‘app_id’ => $client_id, ‘session_key’ => $tokenInfo[‘access_token’], ‘sig’ => $sign ); $userInfo = json_decode(file_get_contents(‘http://www.appsmail.ru/platform/api’ . ‘?’ . urldecode(http_build_query($params))), true); if (isset($userInfo[0][‘uid’])) < $userInfo = array_shift($userInfo); $result = true; >> > ?>
Шаг 5. Извлечение информации о пользователе
Теперь извлекать информацию о пользователе мы можем из массива, хранящегося в переменной $userInfo, по ключам, которые вы можете найти в листинге JSON ответа последнего GET запроса. Я выведу лишь несколько значений:
if ($result) < echo «Социальный ID пользователя: » . $userInfo[‘uid’] . ‘
‘; echo «Имя пользователя: » . $userInfo[‘nick’] . ‘
‘; echo «Email: » . $userInfo[’email’] . ‘
‘; echo «Ссылка на профиль пользователя: » . $userInfo[‘link’] . ‘
‘; echo «Пол пользователя: » . $userInfo[‘sex’] . ‘
‘; echo «День Рождения: » . $userInfo[‘birthday’] . ‘
‘; echo ‘‘; echo «
«; >
Шаг 6. Что же дальше?
На данном этапе дальнейшая последовательность действий остаётся за вами. Если у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу. Если пользователь уже есть, можем проверить, не изменились ли какие-то данные о нём, например, имя или ещё что-то. Если да, обновим запись.
После этого, всё что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION[‘user’] = $userInfo;
На странице выхода из системы просто удаляем сессию с помощью функции unset .
Итог
Ещё один рецепт создания сторонней аутентификацией у вас в копилке.
P.S. В комментариях к предыдущим статьям многие просят показать, что делать дальше. Как заполнить базу данных, как организовать полный процесс. Я обязательно расскажу об этом в заключительной части цикла данных статей, а до этого нам предстоит ознакомиться с созданием подобного функционала ещё для нескольких соц сетей и сервисов.
Дело в том, что процесс работы с БД для всех примеров будет одинаков, а вот в аутентификации через различные соц сети есть свои характерные детали.
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 сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Источник: ruseller.com
Авторизация через ВКонтакте, Mail.ru и другие для самых начинающих
Итак, начнем с ВКонтакте. Заходим на страницу подключения сайта , в дальнейшем настройки подключенного сайта будут доступны вам на странице управления приложениями , там мы узнаем ID приложения и секретный ключ, который естественно раскрывать никому нельзя.
На странице, на которой предполагается кнопочка «Войти через ВКонтакте» требуется добавить в head страницы
script type=»text/javascript» src=»http://userapi.com/js/api/openapi.js?34″>script>
И инициализировать приложение:
VK.init();
Теперь нужно показать пользователю кнопку через вызов виджета. В качестве параметров Auth принимает id элемента, в который нужно отобразить виджет, ширину и адрес страницы, куда мы будем перенаправлены после попытки доступа.
div id=»vk_auth»>div>
script type=»text/javascript»>
VK.Widgets.Auth(«vk_auth», «300px», authUrl: ‘/vklogin.php?’>);
script>
Что увидит пользователь:
После щелчка на «Войти через ВКонтакте» пользователя кидает на страницу вида vkontakte.ru/widget_auth.php?act=a_auth_userhash=d2d47b3c85d1a091a8 , затем на url, указанный вами в параметре AuthUrl при вызове виджета. Кидает со следующими GET параметрами:
first_name (имя), hash (используется для проверки того действительно ли запрос пришел от контакта, а не хакер Вася пытается авторизоваться под чужими данными), last_name (Фамилия), photo (большая аватарка, 119 пикселей шириной), photo_rec (маленькая аватарка, 50х50), uid (id пользователя). Пришедшие к нам параметры я после фильтрации сохранил с такими же именами в глобальной области видимости.
Теперь нам нужно сделать скрипт vklogin.php, в котором мы будем проверять правильность пришедших данных и, либо авторизовывать пользователя если он уже есть в нашей базе, либо создавать новый аккаунт для пользователя зашедшего к нам впервые.
На сайте, на котором мне необходимо было сделать авторизацию в куках сохраняется id пользователя и хеш от соли и хеша пароля. Решение, конечно, не идеальное, но менять полностью весь движок в мои планы не входило. Если пользователь у нас уже есть мы его авторизуем, создав куки, если он впервые, то добавляем его в базу. Также при каждом заходе мы обновляем данные об именах, потому что пользователь мог его поменять, а мы хотим актуальности.
Кроме этого необходимо перед началом использования подобной авторизации убедиться, что в базе нет пользователей с логинами вида vk- (или с теми, которые вы хотите использовать). Также необходимо запретить регистрироваться через обычную регистрацию используемого движка с логинами вида vk- и запретить пользователям из социальной сети менять себе пароль и, опционально, аватарку с отображаемым именем. Для сайтов, в которых критично использование электронной почты зарегистрированных пользователей необходимо будет также ознакомить ваш движок с тем фактом, что у этих пользователей нет электронной почты.
Опционально можно возле каждого вывода имени пользователя на сайте отдельно выделять, что он авторизовался через социальную сеть:
Продолжаем с майл.ру, facebook и твиттером.
Для начала как всегда нам необходимо зарегистрировать в социальной сети свое приложение (у майла четкое разделение между приложениями и сайтами, но я по привычке буду говорить «приложение»). Кстати в процессе регистрации вы увидите от трех до пяти js ошибок, когда-нибудь mail.ru их исправит. После регистрации вам доступны ID приложения, приватный ключ (ничего приватного, используется для js-api вызовов, виден всем) и секретный ключ (используется для сервер-сервер взаимодействия, не говорите никому и не забывайте в комментариях).
На странице настройки приложения мы видим еще один интересный параметр «Адрес страницы receiver.html». Если не ставит целью узнать для чего же она нужна, то единственное что мы узнаем из справки:
Для корректной работы API сайтов необходимо разместить файл receiver.html на вашем домене.
Если не планируете использовать JS API, то этот файл вам не нужен. На страничке авторизации/регистрации мы разместим кнопку. PR-отдел майла очень строго запрещает что-либо менять в логотипе, поэтому мы используем его в строго таком виде, каким он нам предоставлен.
Ссылка на картинке будет либо такая:
connect.mail.ru/oauth/authorize?client_id=APP_IDredirect_uri=_REDIRECT_URI
И тут выясняются не сильно приятные моменты: для подписи/проверки подписи API использует сравнение md5(список всех параметров запроса, отсортированных в алфавитном порядке без знаков prepare( «SELECT id FROM tracker_users WHERE username = :username» );
$stmt->bindParam( «:username» , «mm-<$array[‘ vid ‘]>» , PDO::PARAM_STR, 23);
$stmt->execute();
Для пользователей из социальной сети МойМир я решил выделить логины вида «mm-20цифр». Да, именно 20-тизначное число в качестве айдишника, по запарке не сделайте приведение к обычному целому. После этого если пользователь уже есть в нашей базе, мы просто обновим его данные, создадим ему наши куки и перебросим на главную страницу, если же его нет, то мы создадим запись в таблице и выполним действия из прошлого пункта.
if ($stmt ->fetchColumn() > 0) //если пользователь есть
> else //если пользователя нет
>
Интереса в полном изложении всех запросов и мелочей, как выяснилось из прошлой статьи, ни у кого нет, поэтому остановимся на следующем этапе интеграции — аватарки из социальных сетей. Маленькая картинка (идеально для отображения возле комментариев) находится в $response[0]->pic_small, а вконтактовскую аватарку из прошлой статьи можно получить из GET параметров $_GET[‘photo_rec’]. Надо отметить, что майловские аватарки имеют размер 45 на 45, в то время как из ВКонтакта — 50 на 50. Радует, что оба варианта квадратные и их можно привести к одному размеру. Если хочется привести к 50 на 50, то из майла лучше взять увеличенную аватарку 90 на 90.
Источник: dimation.ru