אימות בסיסי HttpClient

1. סקירה כללית

מדריך זה ימחיש כיצד הגדר את האימות הבסיסי ב- Apache HttpClient 4.

אם אתה רוצה להתעמק וללמוד דברים מגניבים אחרים אתה יכול לעשות עם ה- HttpClient - המשך אל המדריך הראשי של HttpClient.

2. אימות בסיסי עם ה- API

בוא נתחיל עם הדרך הסטנדרטית להגדרת תצורה של אימות בסיסי ב- HttpClient - באמצעות a אישורי ספק:

ספק CredentialsProvider = חדש BasicCredentialsProvider (); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials ("user1", "user1Pass"); provider.setCredentials (AuthScope.ANY, אישורים); לקוח HttpClient = HttpClientBuilder.create () .setDefaultCredentialsProvider (ספק) .build (); HttpResponse response = client.execute (HttpGet חדש (URL_SECURED_BY_BASIC_AUTHENTICATION)); int statusCode = response.getStatusLine () .getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

כפי שאנו רואים, יצירת קושי עם ספק אישורים כדי להגדיר אותו באמצעות אימות בסיסי אינה קשה.

עכשיו, כדי להבין מה HttpClient למעשה יעשה מאחורי הקלעים, נצטרך להסתכל ביומני:

# ... בקשה נשלחת ללא אישורים [ראשי] DEBUG ... - אימות נדרש [main] DEBUG ... - localhost: 8080 ביקש אימות [main] DEBUG ... - תוכניות אימות לפי סדר ההעדפות: [ משא ומתן, Kerberos, NTLM, Digest, Basic] [ראשי] DEBUG ... - אתגר לתכנית אימות משא ומתן לא זמין [main] DEBUG ... - אתגר עבור תוכנית אימות Kerberos לא זמין [main] DEBUG ... - Challenge for ערכת אימות NTLM לא זמינה [ראשי] DEBUG ... - אתגר לתכנית אימות Digest לא זמין [main] DEBUG ... - אפשרויות אימות נבחרות: [BASIC] # ... הבקשה נשלחת שוב - עם אישורים

כל תקשורת לקוח-שרת ברורה כעת:

  • הלקוח שולח את בקשת ה- HTTP ללא אישורים
  • השרת מחזיר אתגר
  • הלקוח מנהל משא ומתן ומזהה את תוכנית האימות הנכונה
  • הלקוח שולח בקשה שנייה, הפעם עם תעודות

3. אימות בסיסי מונע

מחוץ לקופסה, ה- HttpClient לא עושה אימות מקדים. במקום זאת, זו צריכה להיות החלטה מפורשת שקיבל הלקוח.

ראשון, אנחנו צריכים ליצור את HttpContext - אכלוסו מראש במטמון אימות עם סוג נכון של ערכת האימות שנבחרה מראש. המשמעות היא שהמשא ומתן מהדוגמה הקודמת כבר לא נחוץ - אימות בסיסי כבר נבחר:

HttpHost targetHost = HttpHost חדש ("localhost", 8082, "http"); CredentialsProvider credsProvider = חדש BasicCredentialsProvider (); credsProvider.setCredentials (AuthScope.ANY, שם משתמש חדש PasswordCredentials (DEFAULT_USER, DEFAULT_PASS)); AuthCache authCache = חדש BasicAuthCache (); authCache.put (targetHost, חדש BasicScheme ()); // הוסף AuthCache להקשר הביצוע HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credsProvider); context.setAuthCache (authCache);

כעת אנו יכולים להשתמש בלקוח עם ההקשר החדש ו שלח את בקשת האימות מראש:

לקוח HttpClient = HttpClientBuilder.create (). Build (); תגובה = client.execute (HttpGet חדש (URL_SECURED_BY_BASIC_AUTHENTICATION), הקשר); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

בואו נסתכל על היומנים:

[main] DEBUG ... - שימוש חוזר בתכנית אימות 'בסיסית' במטמון עבור // localhost: 8082 [main] DEBUG ... - ביצוע בקשה GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [ראשי] DEBUG ... >> GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... >> מארח: localhost: 8082 [main] DEBUG ... >> הרשאה: dXNlcjE6dXNlcjFQYXNz בסיסי [main] DEBUG ... << HTTP / 1.1 200 OK [main] DEBUG ... - האימות הצליח

הכל נראה בסדר:

  • התוכנית "אימות בסיסי" נבחרה מראש
  • הבקשה נשלחת עם הרשאה כּוֹתֶרֶת
  • השרת מגיב עם 200 בסדר
  • האימות מצליח

4. אימות בסיסי עם כותרות HTTP גולמיות

אימות בסיסי מונע פירושו בעצם שליחה מראש של ה- הרשאה כּוֹתֶרֶת.

אז במקום לעבור על הדוגמה הקודמת והמורכבת למדי כדי להגדיר אותה, אנחנו יכולים להשתלט על הכותרת הזו ולבנות אותה ביד:

HttpGet בקשה = HttpGet חדש (URL_SECURED_BY_BASIC_AUTHENTICATION); מחרוזת auth = DEFAULT_USER + ":" + DEFAULT_PASS; בתים [] encodedAuth = Base64.encodeBase64 (auth.getBytes (StandardCharsets.ISO_8859_1)); מחרוזת authHeader = "בסיסי" + מחרוזת חדשה (encodedAuth); request.setHeader (HttpHeaders.AUTHORIZATION, authHeader); לקוח HttpClient = HttpClientBuilder.create (). Build (); תגובה HttpResponse = client.execute (בקשה); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

בואו נוודא שזה עובד כמו שצריך:

[main] DEBUG ... - מטמון Auth לא מוגדר בהקשר [main] DEBUG ... - פתיחת חיבור {} -> // localhost: 8080 [main] DEBUG ... - התחברות ל- localhost / 127.0.0.1: 8080 [main] DEBUG ... - ביצוע בקשה GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - מצב אימות פרוקסי: UNBALLENGED [main] DEBUG .. . - http-יוצא -0 >> GET / קפיץ-ביטחון-מנוחה-בסיסי-אות / api / foos / 1 HTTP / 1.1 [ראשי] DEBUG ... - http-יוצא -0 >> הרשאה: בסיסי dXNlcjE6dXNlcjFQYXNz [ראשי ] DEBUG ... - http-יוצא -0 << HTTP / 1.1 200 בסדר

לכן, למרות שאין מטמון אימות, אימות בסיסי עדיין עובד כראוי ואנחנו מקבלים 200 בסדר.

5. מסקנה

מאמר זה המחיש דרכים שונות להגדיר ולהשתמש באימות בסיסי עם Apache HttpClient 4.

כמו תמיד, הקוד המוצג במאמר זה זמין באתר Github. זהו פרויקט מבוסס Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


$config[zx-auto] not found$config[zx-overlay] not found