javaandroidandroid-webservice

Logging into a website using Android app (Java)


I am currently trying to make an app that would allow you to log into your account and view whatever data needs to be displayed.

I am not using webview but instead, for displaying information I will be parsing data from HTML and then working from there, extracting data that I need to display. I will post code from my app below.

What I need help with is figuring out how to log into the website with my app.

Basically, steps would look like that:

1.Enter Username

2.Enter Password

3.Press Login Button

4.Send Username&Password to the website

5.If - website returns "Successful login", proceed and parse next page from HTML, Else - display "Wrong username or password"

However, I have no idea how to make my app log in, or at least input data in the website's login fields so that I can at least get a response in some way.

I am very new to this, so please, at least point me in the right direction so that I can figure it out. Thank you very much.

    package com.example.app;

    import androidx.appcompat.app.AppCompatActivity;

    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;

    public class MainActivity extends AppCompatActivity {
        String data;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            TextView LoginTitle = findViewById(R.id.tvLoginTitle);
            EditText Username = findViewById(R.id.etUsername);
            EditText Password = findViewById(R.id.etPass);
            Button Login = findViewById(R.id.btLogin);

            Login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new Parse().execute();
                    Intent intent = new Intent(MainActivity.this,UserAccount.class);
                    intent.putExtra("data",data);
                    startActivity(intent);
                }
            });

        }

        public class Parse extends AsyncTask<Void, Void, Void> {
            @Override
            protected Void doInBackground(Void... voids) {
                try {
                    Document WebPage = Jsoup.connect("https://myurl").get();
                    Log.d("data", WebPage.toString());
                    data=WebPage.toString();
                } catch(Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //Used in guide, however, my implementation of the app doesn't seem to need this.
        }
    }
}

Solution

  • Here is the solution to this:

    class HTTPRequest implements Runnable {
    
        private URL url;
        private User user;
        private Handler handler;
        private String cookie;
    
        //**REDEFINED CONSTRUCTOR
        HTTPRequest(Handler in_handler, User in_user) {
            try {
                            url = new URL("https://yoururl.com");
    
                handler = in_handler;
                user = in_user;
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            try {
                //**Preparing to open connection
                //**Using POST method
                //**Enabling Input & Output
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setDoInput(true);
                conn.setDoOutput(true);
    
                //**Setting Headers to send with POST request
                conn.setRequestProperty("Accept", "text/html");
                conn.setRequestProperty("Accept", "text/xml");
                conn.setRequestProperty("Cookie", "upassword=" + user.getPasswordHashed() + "; ulogin=" + user.getUsername());
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setRequestProperty("charset", "UTF-8");
                conn.setRequestProperty("User-Agent", "Mozilla/5.0");
    
                //**READING RESPONSE FROM THE SERVER:
                //**IF LOGIN WAS SUCCESSFUL, SEND MESSAGE WITH XML DATA BACK TO UI THREAD, ELSE SEND NULL TO UI THREAD
                BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    
                if (isLoginSuccess(input)) {
                    StringBuilder response = new StringBuilder();
                    String tempString;
                    while ((tempString = input.readLine()) != null) {
                        response.append(tempString);
                    }
                    input.close();
                    conn.disconnect();
    
                    Message msg = Message.obtain();
                    msg.obj = response.toString();
                    handler.sendMessage(msg);
                } else if (!isLoginSuccess(input)) {
                    input.close();
                    conn.disconnect();
                    Message msg = Message.obtain();
                    msg.obj = "Wrong";
                    handler.sendMessage(msg);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //**LOGIN IS SUCCESSFUL WHEN THE RESPONSE'S FIRST LINE EQUALS XML DECLARATION
        //**RETURNS TRUE IF THAT IS THE CASE, MEANING YOU HAVE SUCCESSFULLY LOGGED IN
        private boolean isLoginSuccess(BufferedReader input) throws IOException {
            String LoginSuccess = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    
            String response = input.readLine();
            return response.equals(LoginSuccess);
        }
    }
    

    MainActivity.java:

    public class MainActivity extends AppCompatActivity {
    
        public static final String EXTRA_MESSAGE = "Message 1";
        public static final String EXTRA_MESSAGE_2 = "Message 2";
        Handler mainHandler;
        Thread thread;
        User user;
    
        EditText etUsername;
        EditText etPassword;
        CheckBox cbRememberMe;
        Button btLogin;
    
        SharedPreferences preferences;
        SharedPreferences.Editor SPEditor;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setTheme(R.style.LoginPageTheme);
            setContentView(R.layout.activity_main);
    
            //**DECLARATION OF SHARED PREFERENCES
            preferences = getApplicationContext().getSharedPreferences("Preferences", MODE_PRIVATE);
            SPEditor = preferences.edit();
            SPEditor.apply();
    
            //**HANDLER INSTANTIATING AND HANDLING MESSAGES FROM HTTPRequest
            mainHandler = new Handler(Looper.getMainLooper()) {
                @Override
                public void handleMessage(@NonNull Message msg) {
                    String message = msg.obj.toString();
                    thread.interrupt();
                    if (!message.equals("Wrong")) {
                        if (cbRememberMe.isChecked()) {
                            user.RememberLoginSuccess(preferences);
                        }
                        Intent intent = new Intent(getApplicationContext(), ProfilePageActivity.class);
                        intent.putExtra(EXTRA_MESSAGE, message);
                        intent.putExtra(EXTRA_MESSAGE_2, user);
                        startActivity(intent);
                        finish();
                    } else {
                        etUsername.setError("Wrong username or password");
                        etUsername.setText("");
                        etPassword.setText("");
                    }
                }
            };
    
            etUsername = findViewById(R.id.et_username);
            etPassword = findViewById(R.id.et_password);
            cbRememberMe = findViewById(R.id.cb_rememberMe);
            btLogin = findViewById(R.id.bt_login);
    
            btLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String temp_user = etUsername.getText().toString();
                    String temp_pass = etPassword.getText().toString();
                    if (!TextUtils.isEmpty(temp_user) && !TextUtils.isEmpty(temp_pass)) {
                        user = new User(etUsername.getText().toString(), etPassword.getText().toString());
                        thread = new Thread(new HTTPRequest(mainHandler, user));
                        thread.start();
                    } else {
                        etUsername.setError("Please, fill-out the form");
                        etUsername.setText("");
                        etPassword.setText("");
                    }
                }
            });
        }
    }