API на mail.ru

O
На сайте с 13.08.2010
Offline
7
1107

Приветствую!

Хотел сделать для своего ресурса http://ordanet.kz авторизацию через mail.ru как описано на http://api.mail.ru/docs/guides/sites/

Не подскажете как доработать предоставленный скрипт так, чтобы при авторизованном на mail.ru пользователе, на главной страничке ordanet.kz выходила фотка и ФИО авторизованного пользователя.

Спасибо!

Lord Maverik
На сайте с 15.04.2003
Offline
471
#1

Mail.ru как всегда показывает свою лажовость. На странице с API есть ссылка на демо сайт. Так вот: Он не работает!

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
A
На сайте с 29.12.2007
Offline
68
#2

Вроде нормально у них работало. Проверь на loginid.ru - если будет работать, скину код.

P.S.: сам проверить не могу с мобильника.

O
На сайте с 13.08.2010
Offline
7
#3
aktuba:
Вроде нормально у них работало. Проверь на loginid.ru - если будет работать, скину код.

P.S.: сам проверить не могу с мобильника.

Работает, aktuba.

Можеш скрипт скинуть! Если все улажу - буду тебе премного благодарен.

A
На сайте с 29.12.2007
Offline
68
#4
otan:
Работает, aktuba.
Можеш скрипт скинуть! Если все улажу - буду тебе премного благодарен.

<?php

class LoginID_Provider_Mailru extends LoginID_Provider {

const AUTHORIZE_URL = 'https://connect.mail.ru/oauth/authorize';
const TOKEN_URL = 'https://connect.mail.ru/oauth/token';

const SALT = 'salt';

protected $_config = NULL;

protected function execute_method($params) {
if (!$params)
$params = array();
$params['app_id'] = $this -> _config['app_id'];
$params['secure'] = 1;

$sig = '';
$url = '';
$i = 0;
ksort($params);

foreach($params as $key => $var) {
$i++;
$sig .= $key . '=' . $var;
$url .= $key . '=' . $var;
if ($i != count($params))
$url .= '&';
}

$sig = md5($sig . $this -> _config['secret_key']);
$url .= '&sig=' . $sig;
$url = 'http://www.appsmail.ru/platform/api?' . $url;

$data = NULL;
$ch = curl_init();
try {
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$data = curl_exec($ch);
curl_close($ch);
} catch (Exception $e) {
curl_close($ch);
throw new LoginID_Exception($e -> getMessage(), NULL, 403);
}
return $data;
}

protected function get_user_info($uid = NULL, $token) {
$params = array(
'method' => 'users.getInfo',
'session_key' => $token
);

if (NULL !== $uid)
$params['uid'] = $uid;

$result = json_decode($this -> execute_method($params));
return $result[0];
}

public function __construct($provider_name) {
parent::__construct($provider_name);
$this -> _config = Kohana::config('loginid/providers/mailru');
}

public function login() {
$mailru_key = md5(mt_rand(1, 1000) . $_SERVER['REMOTE_ADDR'] . mt_rand(1, 1000));
Session::instance() -> set('mailru_key', md5($mailru_key . self::SALT));

$data = array(
'client_id' => $this -> _config['app_id'],
'response_type' => 'code',
'redirect_uri' => $this -> return_url . '?key=' . $mailru_key,
);

header('Location: ' . self::AUTHORIZE_URL . '?' . http_build_query($data, NULL, '&'));
die();
}

public function complete() {
$key = Session::instance() -> get_once('mailru_key', NULL);
if (empty($key))
throw new LoginID_Exception('Not found provider key', NULL, 403);

$rkey = !empty($_GET['key']) ? $_GET['key'] : NULL;
if (empty($rkey))
throw new LoginID_Exception('Not found get key', NULL, 403);

$mailru_key = md5($rkey . self::SALT);
$mailru_code = !empty($_GET['code']) ? $_GET['code'] : NULL;
if (empty($mailru_code) || $mailru_key != $key)
throw new LoginID_Exception('Login filed!', NULL, 403);

$request = array(
'client_id' => $this -> _config['app_id'],
'client_secret' => $this -> _config['secret_key'],
'grant_type' => 'authorization_code',
'code' => $mailru_code,
'redirect_uri' => $this -> return_url . '?key=' . $rkey,
);

$ch = curl_init();
try {
curl_setopt($ch, CURLOPT_URL, self::TOKEN_URL);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
$data = curl_exec($ch);
curl_close($ch);
} catch (Exception $e) {
curl_close($ch);
throw new LoginID_Exception($e -> getMessage(), NULL, 403);
}

$data = json_decode($data);
if (empty($data -> access_token))
throw new LoginID_Exception('Error Mail.ru responce!', NULL, 403);

$user = $this -> get_user_info(NULL, $data -> access_token);
if (empty($user -> uid))
throw new LoginID_Exception('Invalid user data returned from Mail.ru', NULL, 403);

return array(
'identity' => !empty($user -> link) ? $user -> link : NULL,
'email' => !empty($user -> email) ? $user -> email : NULL,
'name' => !empty($user -> nick) ? $user -> nick : NULL,
'display_name' => !empty($user -> nick) ? $user -> nick : NULL,
);
}

}

Вот часть кода для mail.ru. Остальное - обычная работа с oauth. Будут вопросы - задавай.

P.S.: жестокий тут парсер =) ***91; - открывающая квадратная скобка, ***93; - закрывающая.

O
На сайте с 13.08.2010
Offline
7
#5

Спасибо, aktuba!

Вот только у меня пара вопросов.

Я здесь в коде должен поменять значение параметров app_id и secret_key?

И код который предоставлен mail.ru на http://api.mail.ru/docs/guides/sites/ добавлять в твой код не надо?

A
На сайте с 29.12.2007
Offline
68
#6

http://api.mail.ru/docs/guides/oauth/sites/ - вот это изучите, станет понятнее думаю;)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий