Я получил Google токена и с ним, я запросить URL аутентификации от Google с помощью следующей Curl команды:Преобразования Curl команды в чистый Java
curl --data 'accountType=&Email=&has_permission=1&Token= + $$TOKEN$$ + &service=weblogin%3Acontinue%3Dhttps%253A//www.google.com/dashboard/&source=&androidId=&app=&client_sig=&device_country=&operatorCountry=&lang=&RefreshServices=' -k 'https://android.clients.google.com/auth'
Как я могу преобразовать эту команду в команду чистой Java с URL-соединениями или с библиотекой Apache HTTP? Так что мне больше не нужно использовать двоичный код cURL.
Я видел несколько примеров, но мне приходится сталкиваться с некоторыми проблемами с параметрами POST. Я не могу получить правильно.
Мой Java попробовать:
$$ ЗНАК $$ -> должен быть заменен реальным лексемы.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
public class Test implements Runnable {
public static void main(String args[]) {
new Test();
}
public Test() {
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://android.clients.google.com/auth");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("accountType", ""));
nameValuePairs.add(new BasicNameValuePair("Email", ""));
nameValuePairs.add(new BasicNameValuePair("has_permission", "1"));
nameValuePairs.add(new BasicNameValuePair("Token", "$$ TOKEN $$"));
nameValuePairs.add(new BasicNameValuePair("service", "weblogin%3Acontinue%3Dhttps%253A//www.google.com/dashboard/"));
nameValuePairs.add(new BasicNameValuePair("androidId", ""));
nameValuePairs.add(new BasicNameValuePair("app", ""));
nameValuePairs.add(new BasicNameValuePair("client_sig", ""));
nameValuePairs.add(new BasicNameValuePair("device_country", ""));
nameValuePairs.add(new BasicNameValuePair("operatorCountry", ""));
nameValuePairs.add(new BasicNameValuePair("lang", ""));
nameValuePairs.add(new BasicNameValuePair("RefreshServices", ""));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(post);
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Мои консоли Eclipse напечатает:
Url=https://www.google.com/accounts/ErrorMsg?id=unknown
Error=Unknown
РЕШЕНИЕ:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
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 Test implements Runnable {
public static void main(String args[]) {
new Test();
}
public Test() {
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
String data;
String selectedToken = "xxx YOUR TOKEN HERE xxx";
try {
data = "accountType=&Email=&has_permission=1&Token=" + selectedToken +
"&service=weblogin%3Acontinue%3Dhttps%253A//www.google.com/dashboard/&source=&androidId=" +
"&app=&client_sig=&device_country=&operatorCountry=&lang=&RefreshServices=";
// Disable cert validation
disableCertificateValidation();
HttpURLConnection con = (HttpURLConnection) new URL("https://android.clients.google.com/auth").openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.getOutputStream().write(data.getBytes("UTF-8"));
// Get the inputstream
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
// .. and print it
String tmp;
while((tmp = reader.readLine()) != null) {
System.out.println(tmp);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void disableCertificateValidation() {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
}};
// Ignore differences between given hostname and certificate hostname
HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(hv);
} catch (Exception e) {
// Do nothing
}
}
}
Я просто должен был добавить проверку сертификата SSL, а затем он работал.
напишите свой код и сообщите об ошибке – Satya
Есть ли причина, по которой вы не используете библиотеку OAuth для обработки всего этого? – chrylis
Я отредактировал его в первом посте. –