ورود

View Full Version : سوال: QNetworkRequest + Basic Auth



ciph3r
دوشنبه 31 شهریور 1393, 17:13 عصر
سلام دوستان
بنده سوالی رو خدمتتون داشتم !
من می خواهم برنامه ای بنویسم که مرتب با یوزر نیم و پسورد های مختلف به سی پنل لاگین کنه و اگر یوزر نیم و پسورد درست را به کاربر نشون بده !

حالا برای این کار من از QNetworkAccessmanager استفاده کردم ! (بماند که بعد از کلی تحقیق در مورد سی پنل به این نتیجه رسیدم که لاگینش مثل Authentication می باشد)

حالا بنده آمدم URL را تعریف کردم و به QNetworkrequest دادم و طبق معمول از متد GET با manager برابر با QNetworkReply قرار دادم ، به صورت زیر

QNetworkRequest request(url);
reply = manage->get(request);

حالا برای اینکه به Basic Auth بگم که یوزر نیم و پسوردم چیه از این کد استفاده کردم :

QString concatenated = "username:password";
QByteArray data = concatenated.toLocal8Bit().toBase64();
QString headerData = "Basic " + data;
request.setRawHeader("Authorization", headerData.toLocal8Bit());

و در نهایت شیء Manager را با تابع زیر سیگنا اسلات کردم :

void MainWindow::finished ( QNetworkReply * reply )

حالا مت توسط رسپانس کد که برام برمیگردونه میتونم بفهمم که آیا لاگین درست بوده یا خیر ولی نمیتونم بفهمم که کدام یوزر نیم و پسورد لاگین درست رو انجام داده !

حالا می خوام از شما و تجربیاتتون کمک بگیرم که آیا روش بهتری هست و اگر نیست این روش بالا را چیکار کنم ؟

ciph3r
سه شنبه 01 مهر 1393, 17:57 عصر
دوستان کسی نبود که کممکمون کنه ؟

omid_kma
سه شنبه 01 مهر 1393, 19:54 عصر
متدQNetworkAccessManager::get یک QNetworkReply* بر می گردونه اینارو بصورت pair شده با user password ها داخل یک وکتور ذخیره کنید بعد داخل slot وکتور رو جست و جو کنید و user pass ای که همراه اون reply هست رو بدست بیارید

ciph3r
چهارشنبه 02 مهر 1393, 21:35 عصر
چگونه pair کنم ؟
آیا می تونی از فرمایش بالاتون مثالی واضحتر یا کدی بزارید ؟
متاسفانه زیاد متوجه نشدم فقط قسمت وکتور رو فهمیدم

احسان!
پنج شنبه 03 مهر 1393, 09:11 صبح
سلام
اگه برای زدن رمز سرور میخواید،باید بگم که جواب نمیده.:)
جدای از این که سرور ها بعد از هر بار زدن رمز اشتباه،یه تاخیر چند ثانیه ای ایجاد میکنن،معمولا هم بعد از یه تعداد اشتباه زدن ممکنه آی پی تون رو ببندن.

omid_kma
پنج شنبه 03 مهر 1393, 16:34 عصر
یکفیلد به این شکل بصورت private ّبزارید داخل کلاس

vector<std::pair<QNetworkReply*,std::pair<QString,QString>>> replies

زمانی که QNetworkAccessManager::get استفاده می کنید یک عنصر جدید بهش push_back کنید
این شکلی :

QNetworkReply*reply=manager->get(request);
replies.push_back(std::make_pair(reply,std::make_p air(username,password)));

بعدداخل SLOT این replyرو جست و جو کنید
مثلا به این شکل :

using reply_pair= std::pair<QNetworkReply*,std::pair<QString,QString>>
auto it= std::find_if(replies.begin(),replies.end(),[](const reply_pair& lhs,const reply_pair& ths){
return lhs.first==rhs.second;
})
it->second.first;//user name
it->second.second;//password;

ciph3r
شنبه 05 مهر 1393, 22:17 عصر
سلام
اگه برای زدن رمز سرور میخواید،باید بگم که جواب نمیده.:)
جدای از این که سرور ها بعد از هر بار زدن رمز اشتباه،یه تاخیر چند ثانیه ای ایجاد میکنن،معمولا هم بعد از یه تعداد اشتباه زدن ممکنه آی پی تون رو ببندن.

بله درسته احسان جان ولی من یه روش خودم پیاده سازی کزدم که جواب میده ولی مشکلم در نوشتن یه قسمت از برنامه با کیوت

ciph3r
شنبه 05 مهر 1393, 22:44 عصر
ممنون آقا امید جان بابت کدتون ولی من باز یکم گیجم ، در اینجا معنی Pair یعنی چی و کارش چیه ؟
ما در مرحله اول سوزر و پسورد را داخل حافظه ای از نوع QVector قرار میدیم و بعد اون رو داخل SLOT دنبال محتویات ذخیره شده می گردیم ؟
یایا درست متوجه شدم ؟

omid_kma
یک شنبه 06 مهر 1393, 19:26 عصر
ممنون آقا امید جان بابت کدتون ولی من باز یکم گیجم ، در اینجا معنی Pair یعنی چی و کارش چیه ؟
ما در مرحله اول سوزر و پسورد را داخل حافظه ای از نوع QVector قرار میدیم و بعد اون رو داخل SLOT دنبال محتویات ذخیره شده می گردیم ؟
یایا درست متوجه شدم ؟
pair یک ساختار هست که 2 تا عنصر رو داخلش ذخیره می کنن http://www.cplusplus.com/reference/utility/pair/pair/
بعد این که آره درست متوجه شدید