Базовая аутентификация Войти в Android - PullRequest
0 голосов
/ 02 октября 2019

Прежде всего: я новичок в программировании, и это школьный проект.

Моя проблема: у меня есть базовая маска для входа в систему с использованием строк для сохранения учетных данных пользователей. Учетные данные, если они истинны, сохраняются через SharedPrefences. Теперь я хочу сравнить входные данные пользователя с учетными данными базовой аутентификации моего веб-сервера http://fost19.tk/ (user: fost19, pw: 12345), чтобы войти в приложение пользователя или выдать ему сообщение об ошибке. Пока все работает, но я застрял при подключении к своему веб-серверу и сравнении учетных данных.

Я прочитал несколько вопросов в Интернете, но, если честно, я сейчас совершенно потерян, чтолучший способ добиться этого в текущей сборке Android. Я знаю, что мне нужно расшифровать указанные учетные данные с моего веб-сервера, но я не знаю, как это сделать на Java, и я не знаю, какие «плагины» необходимо добавить в мой проект.

Спасибо за вашу помощь! :)

1 Ответ

0 голосов
/ 02 октября 2019

На следующем шаге вы, вероятно, захотите загрузить контент со своего веб-сайта и обработать его в приложении. Прежде всего, вашему приложению необходимо разрешение Internet. Добавьте следующую строку в файл манифеста под тегом приложения:

<uses-permission android:name="android.permission.INTERNET" />

Для вашего веб-сайта требуется http-аутентификация. Для этого вам необходимо указать свое имя пользователя и пароль в заголовках вашего запроса. Тем не менее, Android не допускает синхронный сетевой трафик. Поэтому мы загружаем контент с веб-сайта в фоновом режиме и можем затем обновить пользовательский интерфейс с помощью обратного вызова. Вы можете добавить мой класс DownloadContent в свой проект:

import android.os.AsyncTask;
import android.util.Base64;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import javax.net.ssl.HttpsURLConnection;

public class DownloadContent extends AsyncTask<String, Void, String> {
private final Callback callback;
private final String username, password;

private DownloadContent(@NonNull String username, @NonNull String password, @NonNull Callback callback) {
    this.callback = callback;
    this.username = username;
    this.password = password;
}

public static void run(@NonNull String username, @NonNull String password, @NonNull Callback callback) {
    DownloadContent loader = new DownloadContent(username, password, callback);
    // runs doInBackground asynchronous
    loader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

@Override
protected String doInBackground(String... strings) {
    try {
        String credentials = username + ":" + password;
        URL url = new URL ("https://vertretungsplanbbscux.000webhostapp.com/auth/index.html");
        // encode to 64 encoded string (necessary for authorization header)
        String base64 = Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
        // perform a post request
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);
        // append encoded username and password as authorization header
        connection.setRequestProperty  ("Authorization", "Basic " + base64);
        InputStream stream = connection.getInputStream();
        BufferedReader reader = new BufferedReader (new InputStreamReader(stream));
        String inputLine;
        StringBuilder response = new StringBuilder();
        // read html of website
        while ((inputLine = reader.readLine()) != null)
            response.append(inputLine);
        reader.close();
        return response.toString();
    } catch(Exception e) {
        e.printStackTrace();
    }
    // return null if an error has occurred
    return null;
}

@Override
protected void onPostExecute(@Nullable String content) {
    // called after doInBackground has finished, synchronous again
    if (content == null) {
        callback.onNotLoaded();
    } else {
        callback.onLoaded(content);
    }
}

public interface Callback {
    void onLoaded(String content);
    void onNotLoaded();
}
}

Вот как вы можете получить доступ к содержимому:

DownloadContent.run("fost19", "12345", new DownloadContent.Callback() {
        @Override
        public void onLoaded(String content) {
            Log.d("DownloadContent", content);
            //TODO display content in user interface
        }

        @Override
        public void onNotLoaded() {
            Log.d("DownloadContent", "could not fetch content from website");
            // TODO show error message
        }
    });

Я надеюсь, что смогу помочь вам с вашим приложением плана замещения.

Edit1: Вы должны использовать только безопасное соединение (https). Поэтому вместо того, чтобы использовать ваш .tk-адрес, я использовал реальный безопасный адрес с вашего сайта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...