http://www.zaachi.com/cs/items/java-https-authorization.html

Java: HTTPS authorization

Publikováno: 19.06.2008 21:04:09

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:

Pro připojení k URL adrese slouží metoda private HttpsURLConnection connection(), která vrací identifikátor spojení:

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:

//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:

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:

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();
		}
	}
}