PDA

View Full Version : لاگین کردن در نرم افزار دسکتاپی



milad_d993
چهارشنبه 29 مهر 1394, 21:14 عصر
سلام دوستان
نرم افزاری مثل یاهو مسنجر بعد از اینکه نام کاربری و پسورد رو چک میکنه (یا نرم افزار های دیگه) چطوریه عمل میکنن اونا که session ندارن

am_al_59
چهارشنبه 29 مهر 1394, 21:53 عصر
هر نرم افزاری روشی داره اما من زمان مسنجر 9 یک روبات نوشته بودم تبلیغات کارمو میکردم
از TcpClient استفاده کردم و سوکت و همون اول که میخواستم به سرورش کانکت بشم یکسری داده هارو میفرستادم تا اجازه برقرارری و باز نگه داشتن ارتباط رو بده
داده هاشو با اسنیفر چک کرده بودم شکل ثابتی داشت. اما همونم با آدرس
https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login={0}&passwd={1}&chal={2}
لاگین میکردم یک توکن میداد بعد به آدرس
https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token={0}
توکنی که گرفته بودم میفرستادم در نهایت که اجازه میداد از طریق tcpclient یک ارتباط پایدار داشته باشم
الان که پرسیدی برناممو باز کردم اینهارو برای مواردی که گفتم نوشته بودم



public void Connect(string userName, string password)
{
binaryObject = new binaryDataClass();
binaryObject.CompleteHttpRequest += new Action<List<string[]>>(binaryObject_CompleteHttpRequest);
binaryObject.UserName = userName;
binaryObject.UserPassword = password;
string ip = getServerIpAddress();
tc = new TcpClient();
tc.Connect(ip, 5050);
sendPacket(yahooService.Verify);
listener = new Thread(new ThreadStart(initializeReciveData));
listener.Start();
}


private void sendPacket(yahooService yc)
{
byte[] data = null;
switch (yc)
{
case yahooService.Verify:
data = binaryObject.getPacket(yahooService.Verify);
break;
case yahooService.Auth:
data = binaryObject.getAuthPacket();
break;
case yahooService.AuthResp:
data = binaryObject.getAutRespPacket();
break;
case yahooService.Chat:
data = binaryObject.getChatPacket();
break;
case yahooService.ChatJoin:
data = binaryObject.getChatJoinPacket(roomName, roomId, lobbyId);
break;
case yahooService.Message:
if (addStyle)
data = binaryObject.getMessagePacketWithStyle(destination UserName, sendMessage, messageFontName, messageFontSize);
else
data = binaryObject.getMessagePacketWithoutStyle(destinat ionUserName, sendMessage);
break;
}
packetDataClass pk = convertBinaryToPacket.ConvertFrom(data);
SendPacketEvent(pk);
tc.Client.Send(data);
}

enum yahooService
{
None = 0x0,
Logon = 0x1,
Logoff = 0x2,
IsAway = 0x3,
IsBack = 0x4,
Idle = 0x5,
Message = 0x6,
NewMail = 0xB,
Ping = 0x12,
Notify = 0x4B,
Verify = 0x4C,
AuthResp = 0x54,
PersonalInfo = 0x55,
Auth = 0x57,
ExperimentalBrowser = 0x9A,
LoginUnknown2 = 0xEF,
BuddyUpdate = 0xF0,
List = 0xF1,
Chat = 0x96,
ChatJoin = 0x98,
ChatExit = 0x9B,
Comment = 0xA8,
ChatLogout = 0xA0
}



public byte[] getPacket(yahooService ys)
{
byte[] data = new byte[20];
for (int i = 0; i < 20; i++)
data[i] = 0;
data[0] = Convert.ToByte('Y');
data[1] = Convert.ToByte('M');
data[2] = Convert.ToByte('S');
data[3] = Convert.ToByte('G');
setPacketVersion(ref data);
data[11] = Convert.ToByte(ys);
setSessionId(ref data);
if (ys == yahooService.AuthResp)
{
setStatus(ref data);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(string.Forma t(
"https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login={0}&passwd={1}&chal={2}",
UserName, UserPassword, ChallengeString));
HttpWebResponse response = null;
response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string reciveString = sr.ReadToEnd();
string[] splitedReciveString = reciveString.Split(new char[] { '\r', '\n' });
httpRequestData.Add(new string[] { splitedReciveString[0], null });
for (int a = 1; a < splitedReciveString.Length; a++)
if (!string.IsNullOrEmpty(splitedReciveString[a]))
httpRequestData.Add(new string[]{
splitedReciveString[a].Substring(0, splitedReciveString[a].IndexOf('=')),
splitedReciveString[a].Substring(splitedReciveString[a].IndexOf('=') + 1)});
tokenString = httpRequestData.Single(a=>a[0]=="ymsgr")[1];
request = (HttpWebRequest)HttpWebRequest.Create(string.Forma t(
"https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token={0}", tokenString));
response = (HttpWebResponse)request.GetResponse();
sr = new StreamReader(response.GetResponseStream());
reciveString = sr.ReadToEnd();
splitedReciveString = reciveString.Split(new char[] { '\r', '\n' });
httpRequestData.Add(new string[] { splitedReciveString[0], null });
for (int a = 1; a < splitedReciveString.Length; a++)
if (!string.IsNullOrEmpty(splitedReciveString[a]))
httpRequestData.Add(new string[]{
splitedReciveString[a].Substring(0, splitedReciveString[a].IndexOf('=')),
splitedReciveString[a].Substring(splitedReciveString[a].IndexOf('=') + 1)});
crumbString = httpRequestData.Single(a=>a[0]=="crumb")[1];
Ystring = httpRequestData.Single(a=>a[0]=="Y")[1];
Tstring = httpRequestData.Single(a=>a[0]=="T")[1];
string crumbChallengeString = crumbString + ChallengeString;
MD5 m = MD5.Create();
yahooHash = Convert.ToBase64String(m.ComputeHash(System.Text.E ncoding.ASCII.GetBytes(crumbChallengeString))).Rep lace("+", ".").Replace("/", "_").Replace("=", "-");
CompleteHttpRequest(httpRequestData);
}
return data;
}

milad_d993
جمعه 01 آبان 1394, 08:16 صبح
ممنونم ولی فکر کنم اشتباه کردم نرم افزار یاهو مسنجر رو مثال زدم
برنامه ای که میخوام اصلا سوکت پروگرمینگ و چت و .... نیاز نداره
من فقط میخوام لاگین کنم.
فکر کنید یه برنامه برای سرویس های وبلاگ دهی میخوایم درست کنیم که بعد از لاگین کردن بتونیم پست جدید ارسال کنیم، حذف کنیم و....
راهکار بهتری نیست؟؟؟

am_al_59
جمعه 01 آبان 1394, 15:20 عصر
بطور مشخص من روی سرویس های وبلاگ کار نکردم
اما الان که شما فرمودین سایت blogfa رو نگاه کردم سیستم لاگینشون از طریق یک صفحه html بود یعنی شما session و کوکی دم دستته
از طریق وب سرویس هم میتونی اقدام کنی مثل همون یاهو توکن بدی و سیستم لاگین عادیتم داشته باشی
منطقی همینه که شما از ابزار مناسب و موجود استفاده کنی
مشکلی یا محدودیتی برای استفاده از کوکی و سشن دارید؟

milad_d993
جمعه 01 آبان 1394, 15:44 عصر
بطور مشخص من روی سرویس های وبلاگ کار نکردم
اما الان که شما فرمودین سایت blogfa رو نگاه کردم سیستم لاگینشون از طریق یک صفحه html بود یعنی شما session و کوکی دم دستته
از طریق وب سرویس هم میتونی اقدام کنی مثل همون یاهو توکن بدی و سیستم لاگین عادیتم داشته باشی
منطقی همینه که شما از ابزار مناسب و موجود استفاده کنی
مشکلی یا محدودیتی برای استفاده از کوکی و سشن دارید؟

با کوکی و سشن مشکلی ندارم ولی مگه امکان استفاده از اینا توی برنامه های C#‎‎‎ وجود داره؟؟؟؟؟
حرف تاکن هم شد؛ من تا حالا فقط از سشن استفاده کردم. احتمالا تاکن منحصر به فرده درسته؟؟؟ موضوعش چیه؟؟؟
به کلمه وبلاگ هم توجه نکنید
اصل منظورم یک اپلیکیشن دسکتاپ برای وبسایتم هست....

am_al_59
جمعه 01 آبان 1394, 15:58 عصر
token یک چیزی مثل امضا یا عبارت یکتا هست مثل همون ای دی من فقط از این مواردش استفاده کردم اگر معانی و کاربردهای دیگه ای داشته باشه من اطلاعی ندارم
راستش من اینو نفهمیدم
1- شما یک نرم افزار دسکتاپ داری میخای به یک وبسایت متصل بشی؟ اگر اینه که وب سایت با asp php یک چیزی نوشته شده و مطابق قواعد همون کارهای لاگین رو انجام میده شما فقط باید پیروی کنی مشکلی برای session , cookie نیست
2- شما یک سایت داری میخوای ملت با desktop app کانکت بشن که خوب اینم مشکلی نیست شما هم میتونی از session , cookie استفاده کنی اما فکر کنم راحت تر باشه یک وب سرویس بزاری که محتویات رو دریافت کنه در این روش شما عملیات تشخیص هویت رو میتونی از طریق یک httpRequest انجام بدی و یک عبارت یکتا رو بعنوان توکن بدی به درخواست کننده و از طریق وب سرویس محتوی رو همراه توکن بگیری و ادامه موارد