В настоящее время я пытаюсь создать безопасную страницу входа для своего приложения Android.
Общая схема процедуры входа в систему выглядит следующим образом:
Это все работало нормально. Тем не мение…..
Недавно я установил сертификат на хост-сервере, делающем сайт HTTPS [защищенным] — поэтому я пошел дальше и изменил «HttpURLConnection» на «Http».sURLConnection «в коде Android для размещения сертификации.
Теперь всякий раз, когда я вхожу в систему с действительными учетными данными, где он должен возвращать PHP, эхо «Login Failed» возвращает нулевое значение … это приводит к избыточности оператора if в фоновой задаче.
Вот код BackgroundTaskLogin.java:
public class BackgroundTaskLogin extends AsyncTask<String,Void,String>{
String response;
Context ctx;
BackgroundTaskLogin(Context ctx){
this.ctx = ctx;
}@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
String login_url = "http://apps02.abbeyfield.com/json/json_login.php";
String method = params[0];
if(method.equals("login")){
String database_name = params[1];
String password_user = params[2];
try {
URL url = new URL(login_url);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
String data = URLEncoder.encode("database_name","UTF-8")+"="+URLEncoder.encode(database_name,"UTF-8")+"&"+
URLEncoder.encode("password_user","UTF-8")+"="+URLEncoder.encode(password_user,"UTF-8");
bufferedWriter.write(data);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
response = "";
String line = "";
while((line = bufferedReader.readLine())!=null){
response += line;
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return response;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
if(result.equals("Login Failed")){
Toast.makeText(ctx, "Database password incorrect", Toast.LENGTH_SHORT).show();
}else{
//Create shared preferences module called "database" and write result to shared preferences variable "database_name"SharedPreferences preferences = ctx.getSharedPreferences("database", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("database_name", result);
editor.apply();
Intent intent = new Intent(ctx, MainActivity.class);
ctx.startActivity(intent);
((Activity)ctx).finish();
}
}
}
Вот код сценария входа в PHP:
<?php
require "../init_accounts.php";
$database_name = $_POST["database_name"];
$password_user = $_POST["password_user"];
$sql_query = "SELECT database_name FROM abhandym_users WHERE database_name LIKE '$database_name' and password_user LIKE '$password_user';";
$result = mysqli_query($con,$sql_query);if (mysqli_num_rows($result)>0)
{
$row = mysqli_fetch_assoc($result);
$database_name = $row["database_name"];
echo "$database_name";
}
else
{
echo "Login Failed" . mysqli_error($con);
}
?>
Я намеренно оставил код в рабочем состоянии, прежде чем изменить все HTTP на HTTPS — Это способ сделать это?
Любое объяснение или совет будет высоко ценится, спасибо заранее!
РЕДАКТИРОВАТЬ 17/01/2017 — По-прежнему нет прогресса в этом, страница входа для Android-приложения под httpsURLConnection по-прежнему не работает 🙁 — кто-нибудь может дать какой-то совет?
ОБНОВЛЕНИЕ 18/01/2017 — Это то, что возвращает logcat при изменении всех http на https:
--------- beginning of crash
01-18 09:49:46.926 3193-3193/com.example.user.ABHandyM E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.user.ABHandyM, PID: 3193
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.example.user.ABHandyM.BackgroundTaskLogin.onPostExecute(BackgroundTaskLogin.java:90)
at com.example.user.ABHandyM.BackgroundTaskLogin.onPostExecute(BackgroundTaskLogin.java:26)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Не совсем уверен, почему он возвращает ноль при изменении типа соединения?
Задача ещё не решена.
Других решений пока нет …