Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
1

Авторизация посредством POST-запроса

23.12.2015, 22:25. Показов 5768. Ответов 57

Author24 — интернет-сервис помощи студентам
Доброго времени суток дорогие формучане. Назрела проблемка, нужно реализовать авторизацию в программе, то есть пользователь вводит пасс и лог в поля, эти поля отсылаются на сервер по средствам POST, там в php файле идёт обработка и сверка с бд, если всё ок отсылает ответ что мол всё ок.
Смог найти как это делается на JAVA, но сколько не искал к сожалению не смог найти толкового объяснения как
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
HttpURLConnection connection = null;
        try {
            URL url = new URL(sURL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("User-Agent", "Launcher Wolf v0.1"); //Передаём версию клиента
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // передаём лог и пасс
            connection.setRequestProperty("Content-Length", Integer.toString(Params.getBytes().length)); //предаём размер
            connection.setRequestProperty("Content-Language", "en-US"); // передаём язык
            
            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);
            
            connection.connect();
            try (DataOutputStream dos = new DataOutputStream(connection.getOutputStream())) {  
                dos.writeBytes(Params);
                dos.flush();
            }
            
            InputStream is = connection.getInputStream();
            StringBuilder resp;
            try (BufferedReader brd = new BufferedReader(new InputStreamReader(is))) {
                resp = new StringBuilder();
                String line;
                while((line = brd.readLine()) !=null) {
                    resp.append(line);
                    resp.append('\r');
                }
            }
            String strn = resp.toString().trim();
            return strn;
Java
1
 String AuthResult = Util.Connect("http://83.167.111.21/launcher/auth.php", "a=auth" + "&user" + user + "&password" + pass);


перепилить под с++

Понял что это делается через библиотеку QtNetwork , в целом это всё.
Вот так выглядит php файлик
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
include ('conn.php');
 
$Arg = mysql_real_escape_string($_POST['a']);
$Login = mysql_real_escape_string(trim(htmlspecialchars($_POST['user'])));
$Pass = mysql_real_escape_string(trim($_POST['password']));
 
if ((preg_match('/'.$version.'/i', $_SERVER['HTTP_USER_AGENT'])))
{
    if (($Arg == 'auth') && ($Login !== null) && ($Pass !== null)) 
    {
        $result = mysql_query("SELECT $db_password FROM `$db_table` WHERE $db_name='$Login'") or die ("AuthError1");
        $res = mysql_fetch_array($result);
        
        $hash = $res[$db_passw];
        $session = rand(99999, 9999999999);
        $query = mysql_query("UPDATE `$db_table` SET $db_sess'$session' WHERE $db_name='$Login'") or die ("AuthError2");
        
            if ($password == $hash) 
            {
                echo $hash.'<>'.$Login.'<>'.$session;
            }
            else 
            {
                echo 'Bad Login';
            }
    
        }
}   
else 
{
    die ('LOL');
}
Буду рад если объясните как построить post запрос.

Заранее спасибо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2015, 22:25
Ответы с готовыми решениями:

Формирование POST-запроса
Всем привет! Пишу программу, которая могла бы загружать фотографии во вконтач. В документации...

Отправка Post запроса на https сайт
Ещё раз добрвый день форумчане.Опять возникла проблема нужно отправить post запрос на https сайт...

Отправка POST запроса с использованием SSL
Салют. У меня есть приложение, которое отправляет POST запрос с идентификатором на сервис и...

Авторизация на сайте посредством Post запроса
Авторизация на сайте по средствам Post запроса На сайте есть форма входа: &lt;form...

57
72 / 72 / 33
Регистрация: 07.11.2015
Сообщений: 281
24.12.2015, 21:32 2
Думаю нужно смотреть в эту сторону. Методы post.
Примеры использования найти несложно.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.12.2015, 13:32 3
QNetworkAccessManager последовательные запросы
0
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
27.12.2015, 14:32  [ТС] 4
Читал, и пытался переделать под свои нужны, но увы не получилось

Добавлено через 11 минут
Был бы крайне признателен если бы кто-либо написал как правильно написать запрос на отправления данных пользователя для сверки с базой, или объяснит как это правильно сделать.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
27.12.2015, 15:10 5
Wolf_Lone, приведи код уже сделанного, а мы тут поправим.
0
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
27.12.2015, 16:31  [ТС] 6
Хорошо, сейчас накатаю

Добавлено через 9 минут
MainWindow
123
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>
#include <QUrl>
#include <QByteArray>
#include <QString>
#include <QTextCodec>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->LoginBtn->setEnabled(false);
 
 
 
 
    QRegExp login("[a-zA-Z0-9]{1,10}");
    QRegExp password("[a-zA-Z0-9]{1,10}");
    ui->LineEditLogin->setValidator(new QRegExpValidator(login, this));
    ui->LineEditPass->setValidator(new QRegExpValidator(password, this));
    connect(ui->LineEditLogin,SIGNAL(textChanged(QString)),this,SLOT(loginEnbl()));
    connect(ui->LineEditPass,SIGNAL(textChanged(QString)),this,SLOT(loginEnbl()));
}
 
void MainWindow::loginEnbl()
{
    ui->LoginBtn->setEnabled(ui->LineEditPass->hasAcceptableInput() and ui->LineEditPass->hasAcceptableInput());
    ui->LineEditPass->setEchoMode(QLineEdit::Password);
}
 
 
void MainWindow::on_LoginBtn_clicked()
{
    QNetworkAccessManager* manager;
    QByteArray Request;
   QUrl site("http://255.255.255.255/auth.php");
   QString Login= ui->LineEditLogin->text();
   QString Pass= ui->LineEditPass->text();
   QString Version= "Launcher Wolf v0.1";
 
   QByteArray postData;
   postData+= "a=auth" ;
   postData+= "user" + QUrl::toPercentEncoding(Login.toUtf8() );
   postData+= "password" + QUrl::toPercentEncoding(Pass.toUtf8() );
 
   QNetworkRequest request(site);
//   request.setHeader(QNetworkRequest::UserAgentHeader, "Version");
   request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
 
   QNetworkReply* reply= manager->post(request, postData);
 
   connect (reply, SIGNAL(finished()),this, SLOT(replyFinished()));
}
 
void MainWindow::replyFinished()
{
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
    if (reply->error()== QNetworkReply::NoError)
    {
        QByteArray content= reply->readAll();
        QTextCodec *codec = QTextCodec::codecForName("cp1251");
        ui->plainTextEdit->setPlainText(codec->toUnicode(content.data()));
    }
    else qDebug()<<reply->errorString();
 
    reply->deleteLater();
}
 
 
MainWindow::~MainWindow()
{
    delete ui;
}

Заголовочный

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QtNetwork/QNetworkReply>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void replyFinished();
    void loginEnbl();
    void on_LoginBtn_clicked();
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H


Добавлено через 20 секунд
При выполнении выдаёт кучу ошибок
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
28.12.2015, 17:42 7
Неправильно формируется postData. Для удобства лучше воспользоваться QUrlQuery
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.12.2015, 00:10 8
C++ (Qt)
1
2
3
4
5
6
// ...
void MainWindow::on_LoginBtn_clicked()
{
    QNetworkAccessManager* manager= new QNetworkAccessManager(this); /* Создавать кто будет? */
    QByteArray Request;
// ...
0
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
29.12.2015, 19:09  [ТС] 9
Один фиг тонна ошибок
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
30.12.2015, 13:17 10
Ты хоть ошибки напиши.
0
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
31.12.2015, 13:42  [ТС] 11
D:\documents\Qt\build-Wolf-Desktop_Qt_5_5_0_MinGW_32bit-Debug\debug\mainwindow.o:-1: In function `ZN10MainWindow19on_LoginBtn_clickedEv':
D:\documents\Qt\Wolf\mainwindow.cpp:38: ошибка: undefined reference to `_imp___ZN21QNetworkAccessManagerC1EP7QObject'
D:\documents\Qt\Wolf\mainwindow.cpp:50: ошибка: undefined reference to `_imp___ZN15QNetworkRequestC1ERK4QUrl'
D:\documents\Qt\Wolf\mainwindow.cpp:50: ошибка: undefined reference to `_imp___ZN15QNetworkRequestC1ERK4QUrl'
D:\documents\Qt\Wolf\mainwindow.cpp:54: ошибка: undefined reference to `_imp___ZN21QNetworkAccessManager4postERK15QNetworkRequestRK10QByteArray'
D:\documents\Qt\Wolf\mainwindow.cpp:54: ошибка: undefined reference to `_imp___ZN21QNetworkAccessManager4postERK15QNetworkRequestRK10QByteArray'
D:\documents\Qt\Wolf\mainwindow.cpp:50: ошибка: undefined reference to `_imp___ZN15QNetworkRequestD1Ev'
D:\documents\Qt\build-Wolf-Desktop_Qt_5_5_0_MinGW_32bit-Debug\debug\mainwindow.o:-1: In function `ZN10MainWindow13replyFinishedEv':
D:\documents\Qt\Wolf\mainwindow.cpp:62: ошибка: undefined reference to `_imp___ZNK13QNetworkReply5errorEv'
D:\documents\Qt\build-Wolf-Desktop_Qt_5_5_0_MinGW_32bit-Debug\debug\mainwindow.o:-1: In function `Z12qobject_castIP13QNetworkReplyET_P7QObject':
D:\Qt\5.5\mingw492_32\include\QtCore\qobject.h:518: ошибка: undefined reference to `_imp___ZN13QNetworkReply16staticMetaObjectE'
collect2.exe:-1: ошибка: error: ld returned 1 exit status

большая их часть ругается на
C++ (Qt)
1
QNetworkRequest request(site);
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2015, 13:44 12
Работа с сетью в Qt осуществляется через QtNetwork. А для того чтобы проект начал поддерживать его, в .pro файле нужно дописать
C++ (Qt)
1
QT += network
1
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
31.12.2015, 20:35  [ТС] 13
Цитата Сообщение от Avazart Посмотреть сообщение
Работа с сетью в Qt осуществляется через QtNetwork
То есть обычным подключением библиотеки не обойтись ?

Добавлено через 2 минуты
Завёлся )))

Добавлено через 2 минуты
Блин, я так полагаю на сервер приходит не правильный запрос потому что он отвечает мне ошибкой, то есть исключением.
Цитата Сообщение от Wolf_Lone Посмотреть сообщение
else
{
die ('LOL');
}
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2015, 22:48 14
Цитата Сообщение от Wolf_Lone Посмотреть сообщение
То есть обычным подключением библиотеки не обойтись ?
Это и есть обычное подключение модуля.
0
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
31.12.2015, 23:16  [ТС] 15
Цитата Сообщение от Avazart Посмотреть сообщение
Это и есть обычное подключение модуля.
Буду знать. Спасибо за информацию.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.01.2016, 00:27 16
Цитата Сообщение от Wolf_Lone Посмотреть сообщение
я так полагаю на сервер приходит не правильный запрос потому что он отвечает мне ошибкой, то есть исключением.
Полагать, гадать на кофейной гуще, раскидывать кости итп не нужно.
Используйте снифер для того что бы видеть как в итоге выглядит запрос который вы шлете и какой получаете следует ответ от сервера.
1
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
03.01.2016, 20:06  [ТС] 17
Цитата Сообщение от Avazart Посмотреть сообщение
Используйте снифер
Спасибо за ценный совет, я теперь хотя бы понимаю что он отправляет.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
03.01.2016, 20:11 18
Жабка отправляет

a=auth&user=test&password=test

ваш код на Qt'е

a=authusertestpasswordtest

Т.е. амперсандов нет, потому что
Цитата Сообщение от Wolf_Lone Посмотреть сообщение
C++ (Qt)
45
46
47
48
QByteArray postData;
postData+= "a=auth" ;
postData+= "user" + QUrl::toPercentEncoding(Login.toUtf8() );
postData+= "password" + QUrl::toPercentEncoding(Pass.toUtf8() );
вы их туда не добавили.
1
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
04.01.2016, 16:36  [ТС] 19
Завилась красавица, данные прилетают
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>
#include <QUrl>
#include <QByteArray>
#include <QString>
#include <QTextCodec>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->LoginBtn->setEnabled(false);
 
 
 
 
    QRegExp login("[a-zA-Z0-9]{1,10}");
    QRegExp password("[a-zA-Z0-9]{1,10}");
    ui->LineEditLogin->setValidator(new QRegExpValidator(login, this));
    ui->LineEditPass->setValidator(new QRegExpValidator(password, this));
    connect(ui->LineEditLogin,SIGNAL(textChanged(QString)),this,SLOT(loginEnbl()));
    connect(ui->LineEditPass,SIGNAL(textChanged(QString)),this,SLOT(loginEnbl()));
}
 
void MainWindow::loginEnbl()
{
    ui->LoginBtn->setEnabled(ui->LineEditPass->hasAcceptableInput() and ui->LineEditPass->hasAcceptableInput());
    ui->LineEditPass->setEchoMode(QLineEdit::Password);
}
 
 
void MainWindow::on_LoginBtn_clicked()
{
    QNetworkAccessManager* manager= new QNetworkAccessManager(this);
    QByteArray Request;
   QUrl site("http://site{ip}/auth.php");
   QString Login= ui->LineEditLogin->text();
   QString Pass= ui->LineEditPass->text();
   QString Version= "v0.1";
 
   QByteArray postData;
   postData+= "a=auth" ;
   postData+= "&";
   postData+= "user=" + QUrl::toPercentEncoding(Login.toUtf8() );
   postData+= "&";
   postData+= "password=" + QUrl::toPercentEncoding(Pass.toUtf8() );
 
   QNetworkRequest request(site);
   request.setHeader(QNetworkRequest::UserAgentHeader, Version);
   request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
 
 
   QNetworkReply* reply= manager->post(request, postData);
 
   connect (reply, SIGNAL(finished()),this, SLOT(replyFinished()));
}
 
void MainWindow::replyFinished()
{
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
    if (reply->error()== QNetworkReply::NoError)
    {
        QByteArray content= reply->readAll();
        QTextCodec *codec = QTextCodec::codecForName("cp1251");
        ui->plainTextEdit->setPlainText(codec->toUnicode(content.data()));
    }
    else qDebug()<<reply->errorString();
 
    reply->deleteLater();
}
 
 
MainWindow::~MainWindow()
{
    delete ui;
}
Добавлено через 33 секунды
Цитата Сообщение от tezaurismosis Посмотреть сообщение
вы их туда не добавили.
Уже увидел, огромное спасибо

Добавлено через 31 секунду
Там ещё не было "=" из-за него данные не прилетали

Добавлено через 1 минуту
С самым сложным всё понятно, осталось разобраться как приходящие данные обработать. Пойду ваять.

Добавлено через 5 минут
Для людей которые будут искать ответ про снифер, мне помог HttpAnalyzer.

Добавлено через 20 часов 13 минут
С сервера приходит
HTML5
1
test<>test<>794542767<>2
то есть логин, пароль, сессия и группа пользователя. Подскажите пожалуйста как обработать эти данные?

Добавлено через 1 минуту
То есть с помощью разделителя
C++ (Qt)
1
QStringList lst = Data.split("<>");
Как их распихать по переменным для последующего сравнения с теми что ввёл пользователь
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
04.01.2016, 17:29 20
Лучший ответ Сообщение было отмечено Wolf_Lone как решение

Решение

C++ (Qt)
1
2
3
4
5
6
QString Data = "test<>test<>794542767<>2";
QStringList lst = Data.split("<>");
QString login = lst.at(0);
QString password = lst.at(1);
QString session = lst.at(2);
QString group = lst.at(3);
В Qt Creator можно встроить справку по нажатию F1, рекомендую эту кнопку.
1
04.01.2016, 17:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2016, 17:29
Помогаю со студенческими работами здесь

Авторизация в Instagram посредством POST
Необходимо авторизоваться в Instagram &quot;юзерскими&quot; методами, т.е. через...

Авторизация с использованием post запроса на сайте
Моя первая попытка авторизации на сайте. import requests def autoriz(): session =...

Авторизация на сайте ппри помощи post-запроса
На сайте есть форма входа: &lt;td class=&quot;bc&quot;&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot;...

(xNet.dll) Ответ POST-запроса (авторизация на одноклассниках)
Здравствуйте. Пытаюсь осуществить авторизацю на odnoklassniki.ru с помощью библиотеки xNet....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru