- PVSM.RU - https://www.pvsm.ru -
Всем привет!
На хабре уже была статья [1] от Nodge [2] про авторизацию на различных сервисах, в том числе и Mail.ru. Но она была для Yii и в ней детально не описывался сам процесс. Так же была статья [3] от propovednik [4], но в ней описывался процесс авторизации через javascript + php. В этой статье я бы хотел детально разобрать серверный метод авторизации. Для авторизации будет использован PHP и модель сервер-сервер.
Переходим по ссылке http://api.mail.ru/sites/my/add [5] и регистрируем наш сайт. Далее скачиваем и заливаем на ftp файл receiver.html, который нужен для верификации нашего сайта.
После регистрации нам выдадут 3 параметра:
Нас будет интересовать только ID и Секретный ключ (Приватный ключ нужен для модели клиент-сервер). Сохраним их в конфигурационном файле нашего скрипта под следующими именами.
$APP_ID;
$APP_SECRET;
Для получения Code нужно обратиться по адресу connect.mail.ru/oauth/authorize [6], передав ему $_GET параметры:
Для удобства разделим логику генерации ссылки на получение code и его обработки:
example.com/login.php [8] — генерируем ссылку для получения code (по-сути ссылка для авторизации).
example.com/auth.php [9] — обработка code.
Итоговый запрос будет выглядеть так:
$redirect_uri = urlencode("http://example.com/auth.php");
$login_url = "https://connect.mail.ru/oauth/authorize?client_id={$APP_ID}&response_type=code&redirect_uri={$redirect_uri}";
Перейдя по этому адресу неавторизованный на Mail.ru пользователь увидит:
.png)
Если пользователь авторизован на Mail.ru, то он увидит такое же окно, но без ввода логина и пароля.
Теперь у пользователя 2 варианта действий: разрешить и запретить. Запретив, пользователь будет перенаправлен на страницу указанную в redirect_uri с указанием ошибки.
Если всё прошло как надо и пользователь разрешил сайту доступ к своим данным, то пользователь будет перенаправлен на страницу redirect_uri (http://example.com/auth.php), с $_GET параметром code.
Сохраним его под именем
$APP_CODE;
Далее нам надо обменять полученный code на идентификатор сессии (token) и id пользователя Mail.ru от лица которого идёт доступ к API.
Для этого надо обратиться по адресу connect.mail.ru/oauth/token [10], передав ему параметры:
Все параметры обязательтны. redirect_uri должен точно совпадать с тем, который мы использовали на 2-ом шаге.
Запрос на получения token может быть выполнен только через POST запрос, поэтому cURL в помощь:
$ch = curl_init();
$url = "https://connect.mail.ru/oauth/token";
$fields = Array(
'client_id' => $APP_ID,
'client_secret' => $APP_SECRET,
'grant_type' => "authorization_code",
'code' => $APP_CODE,
'redirect_uri' => urlencode(redirect_uri)
);
foreach($fields as $key => $value){
$fields_string .= $key . '=' . $value . '&';
}
rtrim($fields_string, '&');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
$result = curl_exec($ch);
curl_close($ch);
$arr = json_decode($result, true);
//или $arr = (array) json_decode($result). Кстати кто-нибудь знает, есть ли разница?
$token = $arr['access_token'];
$uid = $arr['x_mailru_vid'];
После получения token и uid сайт получает долгожданный доступ к API Mail.ru по адресу www.appsmail.ru/platform/api [11].
Но не всё так просто, каждый запрос к API должен быть подписан. Подпись (в нашем случае) представляет собой хэш, рассчитанный по алгоритму md5 из отсортированной в алфавитном порядке строки из передаваемых API параметров без разделителя & и Секретного ключа.
Например:
md5('app_id=423004method=friends.getsession_key=be6ef89965d58e56decdfacb9b62bdaa' . $APP_SECRET);
Mail.ru предусматривает 2 варианта подписи: клиент-сервер и сервер-сервер. Отличие заключается в большей безопасности 2-го подхода. Его мы и будем использовать. Для этого в запросе к API надо указывать secure=1.
Выполним запрос на получение анкетной информации пользователя Mail.ru, воспользовавшись методом users.getInfo.
$request_params = Array(
'app_id' => $APP_ID,
'uids' => $uid,
'method' => 'users.getInfo',
'secure' => 1,
'session_key' => $token
);
//Параметры обязательно должны быть отсортированы в алфавитном порядке
ksort($request_params);
$params = '';
foreach ($request_params as $key => $value) {
$params .= "$key=$value";
}
//В модели сервер-сервер подпись выглядит так
$sig = md5($params . $APP_SECRET);
//Формируем запрос
$url = "http://www.appsmail.ru/platform/api?method=users.getInfo&app_id={$APP_ID}&session_key={$token}&sig={$sig}&uids={$uid}&secure=1";
$response = file_get_contents($url);
$info = (array) json_decode($response);
$info = $info[0];
//весь результат
print_r($info);
Вот и всё. Таким образом мы получили необходимые нам данные для занесения пользователя в базу данных. Весь дальнейший процесс уже неоднократно был описан, например здесь [12]. Так что не вижу смысла его описывать.
PROFIT!!1 Всем добра. Если статья окажется интересной, то могу так же разобрать процесс серверной oAuth 2.0 авторизации для Vkontakte и Facebook.
Ссылки
Автор: yeee737
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/4205
Ссылки в тексте:
[1] статья: http://habrahabr.ru/post/129804/
[2] Nodge: http://habrahabr.ru/users/nodge/
[3] статья: http://habrahabr.ru/post/126872/
[4] propovednik: http://habrahabr.ru/users/propovednik/
[5] http://api.mail.ru/sites/my/add: http://api.mail.ru/sites/my/add
[6] connect.mail.ru/oauth/authorize: https://connect.mail.ru/oauth/authorize
[7] Привилегии: http://api.mail.ru/docs/guides/restapi/#permissions
[8] example.com/login.php: http://example.com/login.php
[9] example.com/auth.php: http://example.com/auth.php
[10] connect.mail.ru/oauth/token: https://connect.mail.ru/oauth/token
[11] www.appsmail.ru/platform/api: http://www.appsmail.ru/platform/api
[12] здесь: http://habrahabr.ru/post/126717/
[13] Документации по авторизации на Mail.ru: http://api.mail.ru/docs/guides/oauth/sites/
[14] Mail.ru REST API: http://api.mail.ru/docs/guides/restapi/
Нажмите здесь для печати.