Java: HTTPS authorization
Jednoduchá ukázka připojení a autorizace pod protokolem HTTPS.
Vytvořit klasické spojení s URL adresou v protokolu HTTP není zřejmě žádný problém. Když se k tomu přidá nutná autorizace uživatele a navíc protokol HTTPS, připojení se může zkomplikovat.
Spojení a autorizace pod protokolem HTTPS je podobné jako pod klasickým HTTP. Rozdíl je v přijetí certifikátu a HTTPS komunikaci.
Výsledná třída má tři vstupní parametry:
- url adresu pro připojení
- přihlašovací jméno pro spojení
- odpovídající přihlašovací heslo
Pro připojení k URL adrese slouží metoda private HttpsURLConnection connection(), která vrací identifikátor spojení:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
private HttpsURLConnection connection() { URL senddata; try { //vytvoreni nove URL senddata = new URL(this.url); HttpsURLConnection con = null; try { //otevreni url con = (HttpsURLConnection) senddata.openConnection(); } catch (IOException e) { e.printStackTrace(); } //vraci ID spojeni return con; } catch (MalformedURLException e) { e.printStackTrace(); } return null; } |
Metoda vrací identifikátor spojení, na jehož základě můžeme provést autorizaci k danému serveru.
Pro autorizaci slouží Metoda private void authorization(HttpsURLConnection con), která se na základě zadaného přihlašovacího jména a hesla pokusí připojit:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//autoriaze private void authorization(HttpsURLConnection con) { //priprava dat pro identifikaci uzivatele String userPassword = this.LoginName + ":" + this.LoginPassword; //zakodovani dat do BASE64 String encoding = new sun.misc.BASE64Encoder().encode(userPassword .getBytes()); //odeslani hlavicky con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //identifikace uzivatele con.setRequestProperty("Authorization", "Basic " + encoding); } |
Pokud se připojení nezdaří, je vrácena chyba:
Server returned HTTP response code: 401 for URL: https://url
Pro ukázku použití je v Main umístěn kód, který načte obsah připojené url adresy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
autorizace auth = new autorizace(url, loginname, password); HttpsURLConnection con = auth.getConnection(); DataInputStream in = null; try { in = new DataInputStream(con.getInputStream()); } catch (IOException e) { e.printStackTrace(); } BufferedReader br = new BufferedReader(new InputStreamReader(in)); try { String strLine = br.readLine(); System.out.print(strLine); } catch (IOException e) { e.printStackTrace(); } try { in.close(); } catch (IOException e) { e.printStackTrace(); } |
Celý zdrojový kód je zde:
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
import java.io.BufferedReader; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class autorizace { //private variables private String url; private String LoginName; private String LoginPassword; //public variables public HttpsURLConnection urlConnection; //konstruktor public autorizace(String url, String LoginName, String LoginPassword) { //nastaveni promennych this.url = url; this.LoginName = LoginName; this.LoginPassword = LoginPassword; this.run(); } private void run(){ //implementace TrustManageru TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType) { } public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType) { } } }; try { SSLContext sc = SSLContext.getInstance("SSL"); HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(hv); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection .setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { try { throw e; } catch (Exception e1) { e1.printStackTrace(); } } //nove https spojeni HttpsURLConnection con = null; //pripojeni k url adrese if ((con = this.connection()) == null) { System.exit(1); } con.setDoOutput(true); try { con.setRequestMethod("POST"); } catch (ProtocolException e1) { e1.printStackTrace(); } con.setDoInput(true); //zavolani metody pro autorizaci this.authorization(con); this.urlConnection = con; } //metoda vraci httpsurlconnection public HttpsURLConnection getConnection() { return this.urlConnection; } //autoriaze private void authorization(HttpsURLConnection con) { //priprava dat pro identifikaci uzivatele String userPassword = this.LoginName + ":" + this.LoginPassword; //zakodovani dat do BASE64 String encoding = new sun.misc.BASE64Encoder().encode(userPassword .getBytes()); //odeslani hlavicky con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //identifikace uzivatele con.setRequestProperty("Authorization", "Basic " + encoding); } //pripojeni k url adrese private HttpsURLConnection connection() { URL senddata; try { //vytvoreni nove URL senddata = new URL(this.url); HttpsURLConnection con = null; try { //otevreni url con = (HttpsURLConnection) senddata.openConnection(); } catch (IOException e) { e.printStackTrace(); } //vraci ID spojeni return con; } catch (MalformedURLException e) { e.printStackTrace(); } return null; } public static void main(String[] args) { String url = "https://www.stag.utb.cz/apps/stag/portal/"; String loginname = "a0460"; String password = "autobus"; autorizace auth = new autorizace(url, loginname, password); HttpsURLConnection con = auth.getConnection(); DataInputStream in = null; try { in = new DataInputStream(con.getInputStream()); } catch (IOException e) { e.printStackTrace(); } BufferedReader br = new BufferedReader(new InputStreamReader(in)); try { String strLine = br.readLine(); System.out.print(strLine); } catch (IOException e) { e.printStackTrace(); } try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } |
Ahoj, diky za zajimave namety na ruzne tema. Jeste by me zajimalo jak se pri HTTPS autorizaci/autentizaci(?) pouziva certifikat uzivatele, tzn. nechci jmeno a heslo, ale certifikat. Mohl bys to trochu popsat? Dik.
Take by me zajimalo jak se pri HTTPS autorizaci/autentizaci(?) pouziva certifikat uzivatele, tzn. nechci jmeno a heslo, ale certifikat. Mohl bys to trochu popsat? Dik.
Nějak se mi nedaří přihlásit se na server.
Hází mi to java.io.IOException: Server returned HTTP response code: 411
když doplním hlavičku
con.setRequestProperty("Content-length", "0");
tak mi vyhodí
java.net.ProtocolException: Server redirected too many times (20)
Můžete někdo napsat, jak můžu poslat na server formulář (input ,hidden data), podobně jako bych z prohlížeče kliknul na submit a poslal formulář, a byl předtím přihlášený?
Ahoj,uvědomuji si, že komentáře jsou přes rok staré ale připojil bych se k žádost uživatele mpas, řeším stejný problém.Díky za jakoukoli odpověď