Skip to content

Commit

Permalink
Authorization update
Browse files Browse the repository at this point in the history
  • Loading branch information
sergejey committed Apr 17, 2023
1 parent 39dc801 commit 50c5d39
Show file tree
Hide file tree
Showing 7 changed files with 366 additions and 5 deletions.
202 changes: 202 additions & 0 deletions modules/yadevices/auth.inc.php
@@ -0,0 +1,202 @@
<?php

$type = gr('type');
$out['TYPE'] = $type;
if (gr('err_msg')) {
$out['ERR_MSG'] = gr('err_msg');
}
if (gr('ok_msg')) {
$out['OK_MSG'] = gr('ok_msg');
}

if (gr('refresh_devices')) {
$this->refreshDevices();
}

if ($type == 'reset') {
@unlink(YADEVICES_COOKIE_PATH);
$this->redirect("?view_mode=" . $this->view_mode);
}

if ($type == 'otp') {
$track_id = gr('track_id');
if ($track_id) {
$otp = gr('otp');
if ($otp!='') {
$post = array(
'csrf_token' => gr('csrf_token'),
'track_id' => $track_id,
'password' => $otp,
'retpath' => 'https://passport.yandex.ru/am/finish?status=ok&from=Login',
);
$postvars = '';
foreach($post as $key=>$value) {
$postvars .= $key . "=" . urlencode($value) . "&";
}
$YaCurl = curl_init();
curl_setopt($YaCurl, CURLOPT_URL, 'https://passport.yandex.ru/registration-validations/auth/multi_step/commit_password');
curl_setopt($YaCurl, CURLOPT_POST, true);
curl_setopt($YaCurl, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($YaCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($YaCurl, CURLOPT_COOKIEFILE, YADEVICES_COOKIE_PATH);
curl_setopt($YaCurl, CURLOPT_COOKIEJAR, YADEVICES_COOKIE_PATH);
$result = curl_exec($YaCurl);
curl_close($YaCurl);
$data = json_decode($result, true);
if ($data['status']=='ok' || $data['errors'][0]=='account.auth_passed') {
$checkCookie = $this->apiRequest('https://iot.quasar.yandex.ru/m/user/scenarios');
if ($checkCookie['status'] != 'ok') {
@unlink(YADEVICES_COOKIE_PATH);
$out['ERR_MSG'] = 'Ошибка авторизации!';
return;
} else {
$this->redirect("?view_mode=" . $this->view_mode . "&refresh_devices=1&ok_msg=" . urlencode("Успешная авторизация!"));
}
} else {
$out['ERR_MSG'] = 'Авторизация не пройдена. Попробуйте ещё раз.';
}
}
$out['TRACK_ID']=$track_id;
} else {
$username = gr('username');
if ($username) {
$csrf_token = $this->getCSRFToken();
if ($csrf_token!='') {
$out['CSRF_TOKEN'] = $csrf_token;
$post = array(
'csrf_token' => $csrf_token,
'login' => $username,
);
$postvars = '';
foreach($post as $key=>$value) {
$postvars .= $key . "=" . urlencode($value) . "&";
}
$YaCurl = curl_init();
curl_setopt($YaCurl, CURLOPT_URL, 'https://passport.yandex.ru/registration-validations/auth/multi_step/start');
curl_setopt($YaCurl, CURLOPT_POST, true);
curl_setopt($YaCurl, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($YaCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($YaCurl, CURLOPT_COOKIEFILE, YADEVICES_COOKIE_PATH);
curl_setopt($YaCurl, CURLOPT_COOKIEJAR, YADEVICES_COOKIE_PATH);
$result = curl_exec($YaCurl);
curl_close($YaCurl);
$data = json_decode($result, true);
if ($data['status']=='ok') {
$track_id = $data['track_id'];
$out['TRACK_ID']=$track_id;
} else {
$out['ERR_MSG']='Ошибка авторизации. Попробуйте ещё раз.';
}

} else {
$out['ERR_MSG'] = 'Ошибка получения CSRF-токена';
}
}

}
}

if ($type == 'qr') {
$track_id = gr('track_id');
if ($track_id) {
$csrf_token = gr('csrf_token');
$post = array(
'csrf_token' => $csrf_token,
'track_id' => $track_id,
);
$postvars = '';
foreach($post as $key=>$value) {
$postvars .= $key . "=" . urlencode($value) . "&";
}

$YaCurl = curl_init();
$url = 'https://passport.yandex.ru/auth/magic/status/';

curl_setopt($YaCurl, CURLOPT_URL, $url);
curl_setopt($YaCurl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0');
curl_setopt($YaCurl, CURLOPT_POST, true);
curl_setopt($YaCurl, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($YaCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($YaCurl, CURLOPT_COOKIEFILE, YADEVICES_COOKIE_PATH);
curl_setopt($YaCurl, CURLOPT_COOKIEJAR, YADEVICES_COOKIE_PATH);
$result = curl_exec($YaCurl);
curl_close($YaCurl);

$data = json_decode($result, true);

if ($data['status']=='ok' || $data['errors'][0]=='account.auth_passed') {
$checkCookie = $this->apiRequest('https://iot.quasar.yandex.ru/m/user/scenarios');
if ($checkCookie['status'] != 'ok') {
@unlink(YADEVICES_COOKIE_PATH);
$out['ERR_MSG'] = 'Ошибка авторизации!';
return;
} else {
$this->redirect("?view_mode=" . $this->view_mode . "&refresh_devices=1&ok_msg=" . urlencode("Успешная авторизация!"));
}
} else {
$out['ERR_MSG'] = 'Авторизация не пройдена. Попробуйте ещё раз.';
}

$out['TRACK_ID'] = $track_id;
$out['QR_URL'] = 'https://passport.yandex.ru/auth/magic/code/?track_id=' . $track_id;
$out['CSRF_TOKEN'] = $csrf_token;

} else {
$csrf_token = $this->getCSRFToken();
if ($csrf_token) {
$post = array(
'csrf_token' => $csrf_token,
'retpath' => 'https://passport.yandex.ru/profile',
'with_code' => 1,
);

$postvars = '';
foreach($post as $key=>$value) {
$postvars .= $key . "=" . urlencode($value) . "&";
}
$YaCurl = curl_init();
curl_setopt($YaCurl, CURLOPT_URL, 'https://passport.yandex.ru/registration-validations/auth/password/submit');
curl_setopt($YaCurl, CURLOPT_POST, true);
curl_setopt($YaCurl, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($YaCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($YaCurl, CURLOPT_COOKIEFILE, YADEVICES_COOKIE_PATH);
curl_setopt($YaCurl, CURLOPT_COOKIEJAR, YADEVICES_COOKIE_PATH);
$result = curl_exec($YaCurl);
curl_close($YaCurl);

$data = json_decode($result, true);
if ($data['status'] == 'ok') {
$out['TRACK_ID'] = $data['track_id'];
$out['CSRF_TOKEN'] = $data['csrf_token'];
$out['QR_URL'] = 'https://passport.yandex.ru/auth/magic/code/?track_id=' . $data['track_id'];
} else {
$out['ERR_MSG'] = 'Ошибка получения QR-кода';
}
} else {
$out['ERR_MSG'] = 'Ошибка получения CSRF-токена';
}
}
}

if ($type == 'cookie') {
global $file;
if (is_file($file)) {
move_uploaded_file($file, YADEVICES_COOKIE_PATH);
$checkCookie = $this->apiRequest('https://iot.quasar.yandex.ru/m/user/scenarios');
if ($checkCookie['status'] != 'ok') {
@unlink(YADEVICES_COOKIE_PATH);
$out['ERR_MSG'] = 'Файл который вы загружаете не является Cookie файлом с сайта Яндекс или он устарел.';
return;
} else {
$this->redirect("?view_mode=" . $this->view_mode . "&refresh_devices=1&ok_msg=" . urlencode("Успешная авторизация!"));
}
}
}

if (!$type) {
$data = $this->apiRequest('https://iot.quasar.yandex.ru/m/user/devices');
if (is_array($data)) {
$out['AUTHORIZED_OK'] = 1;
}

}
29 changes: 29 additions & 0 deletions modules/yadevices/yadevices.class.php
Expand Up @@ -239,6 +239,10 @@ function admin(&$out)
$out['SET_DATASOURCE'] = 1;
}

if ($this->view_mode == 'auth') {
$this->auth($out);
}

if ($this->view_mode == 'refreshScenarios') {
$this->addScenarios();

Expand Down Expand Up @@ -382,6 +386,10 @@ function admin(&$out)
$out['ERRORMONITORTYPE'] = $this->config['ERRORMONITORTYPE'];
}

function auth(&$out) {
include_once(DIR_MODULES.'yadevices/auth.inc.php');
}

function fixOAUTHToken()
{
// getAuth token
Expand Down Expand Up @@ -939,6 +947,27 @@ function apiRequest($url, $method = 'GET', $params = 0, $repeating = 0)
return $data;
}

function getCSRFToken() {
$YaCurl = curl_init();
curl_setopt($YaCurl, CURLOPT_URL, 'https://passport.yandex.ru/am?app_platform=android');
curl_setopt($YaCurl, CURLOPT_COOKIEFILE, YADEVICES_COOKIE_PATH);
curl_setopt($YaCurl, CURLOPT_COOKIEJAR, YADEVICES_COOKIE_PATH);
curl_setopt($YaCurl, CURLOPT_HEADER, 1);
curl_setopt($YaCurl, CURLOPT_POST, false);
curl_setopt($YaCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($YaCurl, CURLOPT_VERBOSE, false);
curl_setopt($YaCurl, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($YaCurl);
curl_close($YaCurl);

if (preg_match('/"csrf_token" value="(.+?)"/', $result, $m)) {
$token = $m[1];
return $token;
} else {
return false;
}
}

function getToken()
{
//Получение токенов для отправки запросов в Яндекс
Expand Down
17 changes: 12 additions & 5 deletions templates/yadevices/action_admin.html
@@ -1,6 +1,3 @@
[#if OAUTH_TOKEN == ''#]
[#inc login_form.html#]
[#else#]
<div class="row" style="margin-top: -10px;">
<div class="col-md-12" style="color:white;padding-top: 10px;padding-bottom: 10px;border-radius: 5px;background: radial-gradient(circle farthest-corner at 10px 10px, #ae21ff, #6121ff);">
<div class="row">
Expand All @@ -9,13 +6,14 @@
</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12 text-right" style="flex-direction: column;">
<a href="https://mjdm.ru/forum/viewtopic.php?f=5&t=7359" target="_blank" style="margin-right: 5px;border-right: 1px solid white;padding-right: 5px;color: white;text-decoration: none;"><i class="glyphicon glyphicon-fire"></i> Баги и обсуждение</a>

[#if COOKIE_FILE == 1#]
[#if VIEW_MODE="search_yastations" || VIEW_MODE="" || VIEW_MODE="search_yadevices"#]
<a href="?mode=refresh&tab=<#TAB#>&view_mode=<#VIEW_MODE#>" style="margin-right: 5px;border-right: 1px solid white;padding-right: 5px;color: white;text-decoration: none;"><i class="glyphicon glyphicon-refresh"></i> Обновить</a>
[#endif#]
<a href="javascript://" onclick="$('#settings_block').toggle();" style="margin-right: 5px;border-right: 1px solid white;padding-right: 5px;color: white;text-decoration: none;"><i class="glyphicon glyphicon-cog"></i> Настройки</a>
[#endif#]
<a href="?view_mode=auth" style="text-decoration:none;color:white;"><i class="glyphicon glyphicon-lock"></i> Авторизация</a>
|
<a href="?view_mode=logout" style="text-decoration:none;color:white;"><i class="glyphicon glyphicon-log-out"></i> Выход</a>
</div>
</div>
Expand All @@ -27,7 +25,13 @@

[#if COOKIE_FILE != 1#]
[#if VIEW_MODE="search_yastations" || VIEW_MODE=""#]

<!--#
[#inc need_coockie.html#]
#-->
<h2>Авторизация</h2>
<p>Для корректной работы модуля необходимо <a href="?view_mode=auth">пройти авторизацию</a>.</p>

[#endif VIEW_MODE#]
[#endif#]

Expand Down Expand Up @@ -57,6 +61,10 @@
</div>
<div>&nbsp;</div>

[#if VIEW_MODE="auth"#]
[#inc auth.html#]
[#endif#]


[#if VIEW_MODE="search_yastations" || VIEW_MODE=""#]
[#inc yastations_search_admin.html#]
Expand All @@ -83,4 +91,3 @@
[#endif VIEW_MODE#]


[#endif#]
62 changes: 62 additions & 0 deletions templates/yadevices/auth.html
@@ -0,0 +1,62 @@
<h2>Авторизация</h2>
[#if ERR_MSG!=""#]
<div class="alert alert-danger">[#ERR_MSG#]</div>
[#endif ERR_MSG#]

[#if OK_MSG!=""#]
<div class="alert alert-success">[#OK_MSG#]</div>
[#endif OK_MSG#]

[#if TYPE=""#]
<div>
Состояние авторизации:
[#if AUTHORIZED_OK="1"#]
<span class="label label-success">Авторизовано</span>
<sup>
<a href="?view_mode=<#VIEW_MODE#>&type=reset" onclick="return confirm('Данные авторизации будут удалены. Продолжить?');">Удалить авторизацию</a>
</sup>
[#else#]
<span class="label label-danger">Не авторизовано</span>
[#endif#]
</div>
&nbsp;
<h3>Выберите способ авторизации:</h3>
<table class="table">
<tr>
<td>
<a href="?view_mode=<#VIEW_MODE#>&type=qr" class="btn btn-default">QR-код</a>
</td>
<td>
Авторизация по QR-коду с помощью приложения Я.Ключ
</td>
</tr>
<tr>
<td>
<a href="?view_mode=<#VIEW_MODE#>&type=otp" class="btn btn-default">Одноразовый пароль</a>
</td>
<td>
Авторизация с помощью одноразового пароля
</td>
</tr>
<tr>
<td>
<a href="?view_mode=<#VIEW_MODE#>&type=cookie" class="btn btn-default">Cookie-файл</a>
</td>
<td>
Загрузка cookie-файла
</td>
</tr>
</table>
[#endif TYPE#]

[#if TYPE="otp"#]
[#inc auth_otp.html#]
[#endif TYPE#]

[#if TYPE="cookie"#]
[#inc auth_cookie.html#]
[#endif TYPE#]

[#if TYPE="qr"#]
[#inc auth_qr.html#]
[#endif TYPE#]
16 changes: 16 additions & 0 deletions templates/yadevices/auth_cookie.html
@@ -0,0 +1,16 @@
<p>
Для работы данного способа, необходимо скачать файл с данными Cookie сформированный на странице <a href="https://yandex.ru/quasar/iot/" target="_blank">Yandex IOT</a>.
После скачивания файла его необходимо загрузить в данную форму.
</p>
<form action="?" method="post" enctype="multipart/form-data">
<div class="from-group">
<input name="file" type="file">
</div>
&nbsp;
<div class="form-group">
<input type="submit" id="Cookie_upload" name="submit" value="Загрузить" class="btn btn-success">
<a href="?view_mode=<#VIEW_MODE#>" class="btn btn-default"><#LANG_CANCEL#></a>
</div>
<input type="hidden" name="view_mode" value="<#VIEW_MODE#>">
<input type="hidden" name="type" value="<#TYPE#>">
</form>

0 comments on commit 50c5d39

Please sign in to comment.