PDA

View Full Version : مشکل لاگین شدن



Jagool
دوشنبه 18 اسفند 1399, 02:32 صبح
سلام دوستان

من یه مشکل دارم با Authorization و دریافت اطلاعات از سایت اگر کسی میتونه ممنون میشم کمکم کنه

لینکی که من میخوام ازش اطلاعات دریافت کنم اینه👇

https://the-internet.herokuapp.com/basic_auth

یوزر admin هستش و پسورد هم admin

من توی اندروید استودیو از jsoup و retrofit هم استفاده کردم اما نتیجه ای نگرفتم

به شیوه زیر هم عمل کردم اما باز به نتیجه نرسیدم👇

https://admin:admin@site addressee.com

لطفا اگه دوستان راه حلی بلد هستن کمک کنن🙏

Nevercom
سه شنبه 19 اسفند 1399, 17:33 عصر
این رو مطالعه کنید: https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side

بصورت خلاصه باید یک Header به درخواست اضافه کنید که کلیدش Authorization باشه و مقدارش یک String با فرمت Basic YWRtaW46YWRtaW4=:


با عبارت Basic شروع بشه
یک Space بعد از Basic
و بعد یک String که حاوی username:password هست و بصورت Base64 انکود شده باشه


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


OkHttpClient client = new OkHttpClient().newBuilder()
.build();
Request request = new Request.Builder()
.url("https://the-internet.herokuapp.com/basic_auth")
.method("GET", null)
.addHeader("Authorization", "Basic YWRtaW46YWRtaW4=")
.build();
Response response = client.newCall(request).execute();


اون رشته‌ای که بعد از Basic قرار داره با به هم چسبوندن username و password که با یه علامت : از هم جدا شدن (admin:admin) و بعد Base64 کردنش بدست اومده

Jagool
چهارشنبه 20 اسفند 1399, 00:38 صبح
این رو مطالعه کنید: https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side

بصورت خلاصه باید یک Header به درخواست اضافه کنید که کلیدش Authorization باشه و مقدارش یک String با فرمت Basic YWRtaW46YWRtaW4=:


با عبارت Basic شروع بشه
یک Space بعد از Basic
و بعد یک String که حاوی username:password هست و بصورت Base64 انکود شده باشه


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


OkHttpClient client = new OkHttpClient().newBuilder()
.build();
Request request = new Request.Builder()
.url("https://the-internet.herokuapp.com/basic_auth")
.method("GET", null)
.addHeader("Authorization", "Basic YWRtaW46YWRtaW4=")
.build();

Response response = client.newCall(request).execute();


اون رشته‌ای که بعد از Basic قرار داره با به هم چسبوندن username و password که با یه علامت : از هم جدا شدن (admin:admin) و بعد Base64 کردنش بدست اومده

بسیار ممنون از پاسخ و راهنمایی مفصل و کاملتون nevercom عزیز
من کد شما رو کپی کردم توی برنامه خودم ، اما به قسمت .execute گیر میداد و می گفت که باید با دستور try و catch نوشته بشه ، من با دستور try و catch نوشتمش اما برنامه حین اجرا کرش میکنه و اجرا نمیشه! بنظرتون مشکل کجاست؟
کد الان به این شکل شده : (مجوز اتصال به اینترنت رو هم توی manifest دادم)


public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);




OkHttpClient client = new OkHttpClient().newBuilder()
.build();
Request request = new Request.Builder()
.url("https://the-internet.herokuapp.com/basic_auth")
.method("GET", null)
.addHeader("Authorization", "Basic YWRtaW46YWRtaW4=")
.build();

try {
Response response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}


}
}

بازم ممنون از پاسخ دهیتون

Nevercom
چهارشنبه 20 اسفند 1399, 01:56 صبح
موضوع مهم اون بخش Header هست. تکه کدی هم که گذاشتم از Postman کپی کردم و هدف فقط این بود که نحوه‌ی ست کردن Header رو در این کتابخانه خاص ببینید.

دلیل خطا هم به احتمال زیاد این هست که متد execute بصورت Synchronous اجرا میشه و در UI Thread اجازه همچین کاری نداریم.
اگر جستجو کنید (یا داکیومنت خود OkHttp رو بخونید) راه درستش رو پیدا می‌کنید. باید متد execute رو در یک Thread دیگه اجرا کنید یا ساده‌تر اینکه از متد enqueue استفاده کنید.(https://square.github.io/okhttp/recipes/#asynchronous-get-kt-java)

Jagool
چهارشنبه 20 اسفند 1399, 02:00 صبح
موضوع مهم اون بخش Header هست. تکه کدی هم که گذاشتم از Postman کپی کردم و هدف فقط این بود که نحوه‌ی ست کردن Header رو در این کتابخانه خاص ببینید.

دلیل خطا هم به احتمال زیاد این هست که متد execute بصورت Synchronous اجرا میشه و در UI Thread اجازه همچین کاری نداریم.
اگر جستجو کنید (یا داکیومنت خود OkHttp رو بخونید) راه درستش رو پیدا می‌کنید. باید متد execute رو در یک Thread دیگه اجرا کنید یا ساده‌تر اینکه از متد enqueue استفاده کنید.(https://square.github.io/okhttp/recipes/#asynchronous-get-kt-java)

مشکلم حل شد باید بجای execute از Call onResponse و onFailure استفاده میکردم
ممنون از حوصله و راهنمایی عالیتون:قلب:
یه سوال دیگه ، لینک بالا یک نمونه آزمایشی بود گذاشتم که شما متوجه بشید منظورم اتصال به چه نوع لاگینی (popup login) هستش ، الان که جواب داد میخوام به لوکال هاست روترم وصل بشم اما با کد بالا وصل نمیشه! البته فکر کنم بخطر این باشه که Basic نیست...
یه عکس براتون از لوکال هاست روتم میذارم ، لطفا ببینید میتونید منو راهنمایی کنید
https://uupload.ir/files/3owk_2021-03-10_2-33-25.png
https://uupload.ir/files/3owk_2021-03-10_2-33-25.png (https://uupload.ir/)

Nevercom
چهارشنبه 20 اسفند 1399, 02:19 صبح
این رو مطالعه کنید: https://en.wikipedia.org/wiki/Digest_access_authentication#Example_with_explanat ion

Jagool
چهارشنبه 20 اسفند 1399, 03:00 صبح
این رو مطالعه کنید: https://en.wikipedia.org/wiki/Digest_access_authentication#Example_with_explanat ion

ممنون مشکلم حل شد