Witajcie,
Chciałbym poruszyć wątek, z którym od wczoraj walczę, zebrać trochę Waszych opinii, doświadczeń, ustalić najlepszą metodykę w obrębie poradzenia sobie z tego typu problematyką.
Napisałem aplikację, która posiada funkcjonalność rejestracji/logowania, odbywa się tak (pseudo kod):
SignUp.java -> sendAuth() -> Apache (PHP)
Po stronie androida zbieram dane do paska REQUEST (pomijam aspekty bezpieczeństwa, tego co lepsze, GET, POST, trala), układam go w zmienne, szyfruje hasło sha256 z inputa, base-uję cały pasek i pcham do serwera z wykorzystaniem HttpUrlConnection. Po stronie PHP index dekoduje sobie pasek, rozbiera parametry, dodatkowo pokrywa sh256 sha1 z saltem i ładuje do bazy.
Teraz moje pytanie brzmi, jak rozwiązujecie problem sesyjności i ciastek? Widziałem, że grom ludzi po prostu korzysta z WebView, ale ja uważam, że jeśli to jest aplikacja na Android, to ma to być komponentami Androida rozwiązane i pewnie support dla ciastek jest. Widziałem trochę implementacji opartych o ciastka, ale żadne nie wyczerpywały znamion moich potrzeb implementacyjnych.
Rozumiem, że aplikacja Android w odpowiedzi na zapytanie do index.php dostanie identyfikator ciastka, musi go gdzieś przechowywać i za każdym następnym strzałem do tego indexu w ramach tego identyfikatora wysłać je ponownie, aby index wiedział że ta sesja jest wciąż aktualna. W przypadku zamknięcia wszystkich aktywności, czyli wyłączenia programu, factory traciłoby ciastko.
Ktoś podrzuci jakiś pomysł?
---------- Post dołączono o 00:01 ---------- Poprzedni post napisano o 23:47 ----------
Myślałem o tym, aby przy kilku określonych czynnościach w obrębie życia programu robić po prostu update do bazy danych z ostatnią czynnością/aktywnością (lastactivity), ale boję się trochę o testy wydajnościowe... nie chciałbym aby mi co chwile 150 tys. ludzi robiło udpate na mysqlu, nawet sklastrowanym.
---------- Post dołączono o 00:33 ---------- Poprzedni post napisano o 00:01 ----------
Dobra, mam kilka newsów:
Po stronie PHP (ustawiłem zapisywanie sesji do pliku dla testów, docelowo do bazy poleci):
ini_set("session.save_path", '/testy/sesje');
ini_set("session.cookie_secure", 'Off');
ini_set("session.bug_compat_42", 'Off');
ini_set("session.bug_compat_warn", 'Off');
ini_set("session.gc_maxlifetime", 1440);
ini_set("session.name", 'APPSESSID');
session_name('aplikacja');
session_start();
$APPSESSID = $_COOKIE['aplikacja'];
Po stronie Javy:
import java.io.*;
import java.net.*;
import java.util.*;
public class Fetch {
public static void main(String args[]) throws Exception {
Console console = System.console();
if (args.length == 0) {
System.err.println("URL missing");
System.exit(-1);
}
String urlString = args[0];
CookieManager manager = new CookieManager();
manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(manager);
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
Object obj = connection.getContent();
url = new URL(urlString);
connection = url.openConnection();
obj = connection.getContent();
CookieStore cookieJar = manager.getCookieStore();
List cookies = cookieJar.getCookies();
int i = 0;
while (i < cookies.size())
{
System.out.println( cookies.get(i) );
i++;
}
}
}
Odpaliłem kod z parametrem strony, np. "http://du*a.pl/"
Rezultat:
aplikacja=1f9355d035769ec0f075aacf10c504ea
Czyli sesje wracają prawidłowo, teraz tylko muszę przemyśleć jak tym zarządzać w kontekście pracy użytkownika będącego zalogowanym. PHP posiada garbage collector, który wymiata sesje z określonym w php.ini interwałem czasowym. Także sesjami się nie trzeba martwić. Można mu napisać też procedury wymiatania tego z bazy, więc aktualnie zalogowanych użytkowników mógłbym przy pobieraniu listy z ich loginami fetchować na podstawie indeksowanej tabeli bazy danych z sesjami, gdyż sesje te wskazywały by na to że ludek jest dostępny.