Hoi,
Ik ben bezig met een Android applicatie (in Java) die communiceert mijn een .NET Webservice. Heel simpel gezegd stuurt de Android app een URL naar de webservice, waar de (html source van de) webpagina onder die URL wordt gedownload. De html wordt dan geparsed en alleen de info die de app nodig heeft wordt terug gestuurd.
De webpagina's die de webservice moet downloaden hebben echter authenticatie nodig, als je niet ingelogd bent word je gewoon naar de login pagina gestuurd. De webservice heeft dus inlog gegevens nodig om aan de html te kunnen komen.
Ik kan mijn webservice "laten inloggen" door een http POST te doen (met username/password parameters) naar de login pagina. Als ik daarna dezelfde CookieContainer van de gebruikte HttpWebRequest gebruik voor elke volgende request dan heb ik de juiste cookies om ingelogd te zijn en heb ik toegang tot de pagina's, vanuit mijn webservice.
Elke gebruiker van de Android app heeft in principe zijn eigen inlog gegevens (email + wachtwoord), waarmee ze moeten inloggen, echter wil ik om verschillende redenen niet deze gegevens van de Android app naar mijn webservice gaan sturen. Ik heb het wachtwoord op de webservice (om in te loggen) uiteraard in plain text nodig (ik kan het dus niet gehashed oversturen want daarmee kan ik niet inloggen), maar dat maakt het onderscheppen van hele lijsten met email/wachtwoord combinaties dus vrij eenvoudig lijkt me - niet de bedoeling. Ook al zou ik op een of andere manier veilig het wachtwoord op mijn server krijgen, dan nog moeten gebruikers mij maar vertrouwen dat ik er niks mee doen (ik zou natuurlijk fijn een database kunnen opbouwen met iedereen z'n account gegevens).
Om te voorkomen dat ik gevoelige data ga oversturen (en potentieel opslaan) had ik het volgende bedacht:
1. Het inloggen gebeurt volledig aan de Android kant. Ik gebruik een http POST in de app om zo aan de nodige cookies te komen.
2. Daarna stuur ik de cookies gewoon door naar de webservice.
3. Op de webservice bouw ik een nieuwe CookieContainer van deze cookies, die ik dan zou kunnen gebruiken om in te loggen.
Op deze manier stuur ik alleen de cookie data door en geen wachtwoorden.
De manier waarop ik dit doe is als volgt. Aan de Android kant gebruik ik de volgende code om een username + password te gebruiken om in te loggen en sla ik de cookies op in het User object:
Dit User object wordt daarna (in JSON format) naar mijn webservice gestuurd. De cookies worden verstuurd als 3 arrays: de namen, de waardes en de domains. Hiermee bouw ik daarna een nieuwe CookieContainer die ik voor elke request op de webservice wil gebruiken om de gebruiker te authenticeren:
Nu ik dit ga testen lijkt het echter niet te werken om een hele stomme reden. Stel dat ik de gebruiker een lijst met threads wil tonen een bepaalde URL. De webservice zou dan de html source van die pagina moeten downloaden, echter zie ik dmv debuggen dat hij een heel andere pagina voorgeschoteld krijgt: namelijk een (andere) login pagina met een waarschuwing dat ik Javascript aan moet zetten...
Het lijkt er dus op dat de website denkt dat ik geen Javascript heb draaien. Nou ja, "ik" ben nou eenmaal geen browser maar een simpele HttpWebRequest, dus daar kan ik inkomen. Het vreemde is nu dat dit wel werkt als ik de webservice lokaal aan het debuggen ben!!
Als ik mijn project debug en gewoon via het ingebouwde webservice 'test formulier' de parameters ingeef, dan krijg ik netjes de juiste pagina source te zien. De cookie parameters haal ik dan rechtstreeks uit de Android app (die heb ik op de achtergrond in debug mode draaien en copy/paste daar gewoon de cookie names, values en domains uit). Voor zover ik kan zien ben ik dus exact hetzelfde aan het doen als in een live omgeving met het enige verschil dat de webservice nu lokaal draait en niet op mijn webserver (wel exact dezelfde code), en op die manier werkt het wel, ik word niet doorgelinkt naar een 'please enable javascript' site en ik krijg alles gewoon mooi door. Zodra ik de code op m'n webserver zet en met dezelfde parameters aanroep werkt het niet meer en gaat hij dus zeuren dat ik geen javascript heb.
Wat kan voor dit verschil zorgen? Mis ik bepaalde cookies die gebruikt worden om te bepalen of javascript enabled is of niet? Als ik het forum met Chrome benader terwijl de Developer Tools draaien (waarmee ik de cookies kan inzien) dan zie ik wel vergelijkbare cookies maar niet exact dezelfde.
Heeft iemand enig idee waar dit aan kan liggen en wat ik er aan kan doen om niet doorgestuurd te worden naar de 'enable javascript' pagina?
Bedankt!
Ik ben bezig met een Android applicatie (in Java) die communiceert mijn een .NET Webservice. Heel simpel gezegd stuurt de Android app een URL naar de webservice, waar de (html source van de) webpagina onder die URL wordt gedownload. De html wordt dan geparsed en alleen de info die de app nodig heeft wordt terug gestuurd.
De webpagina's die de webservice moet downloaden hebben echter authenticatie nodig, als je niet ingelogd bent word je gewoon naar de login pagina gestuurd. De webservice heeft dus inlog gegevens nodig om aan de html te kunnen komen.
Ik kan mijn webservice "laten inloggen" door een http POST te doen (met username/password parameters) naar de login pagina. Als ik daarna dezelfde CookieContainer van de gebruikte HttpWebRequest gebruik voor elke volgende request dan heb ik de juiste cookies om ingelogd te zijn en heb ik toegang tot de pagina's, vanuit mijn webservice.
Elke gebruiker van de Android app heeft in principe zijn eigen inlog gegevens (email + wachtwoord), waarmee ze moeten inloggen, echter wil ik om verschillende redenen niet deze gegevens van de Android app naar mijn webservice gaan sturen. Ik heb het wachtwoord op de webservice (om in te loggen) uiteraard in plain text nodig (ik kan het dus niet gehashed oversturen want daarmee kan ik niet inloggen), maar dat maakt het onderscheppen van hele lijsten met email/wachtwoord combinaties dus vrij eenvoudig lijkt me - niet de bedoeling. Ook al zou ik op een of andere manier veilig het wachtwoord op mijn server krijgen, dan nog moeten gebruikers mij maar vertrouwen dat ik er niks mee doen (ik zou natuurlijk fijn een database kunnen opbouwen met iedereen z'n account gegevens).
Om te voorkomen dat ik gevoelige data ga oversturen (en potentieel opslaan) had ik het volgende bedacht:
1. Het inloggen gebeurt volledig aan de Android kant. Ik gebruik een http POST in de app om zo aan de nodige cookies te komen.
2. Daarna stuur ik de cookies gewoon door naar de webservice.
3. Op de webservice bouw ik een nieuwe CookieContainer van deze cookies, die ik dan zou kunnen gebruiken om in te loggen.
Op deze manier stuur ik alleen de cookie data door en geen wachtwoorden.
De manier waarop ik dit doe is als volgt. Aan de Android kant gebruik ik de volgende code om een username + password te gebruiken om in te loggen en sla ik de cookies op in het User object:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| public static User getLogin(String username, String password) { User user = new User(); user.username = username; DefaultHttpClient httpclient = new DefaultHttpClient(); try { HttpPost httpost = new HttpPost("https://members.iracing.com/membersite/Login"); List <NameValuePair> nvps = new ArrayList <NameValuePair>(); nvps.add(new BasicNameValuePair("username", username)); nvps.add(new BasicNameValuePair("password", password)); httpost.setEntity(new UrlEncodedFormEntity(nvps)); HttpResponse response = httpclient.execute(httpost); HttpEntity entity = response.getEntity(); List<Cookie> cookies = httpclient.getCookieStore().getCookies(); if (cookies.isEmpty()) { System.out.println("No cookies"); return null; } else { user.cookies.clear(); user.cookies.addAll(cookies); } } catch (Exception ex) { System.out.println("Exception: " + ex.toString()); return null; } finally { httpclient.getConnectionManager().shutdown(); } return user; } |
Dit User object wordt daarna (in JSON format) naar mijn webservice gestuurd. De cookies worden verstuurd als 3 arrays: de namen, de waardes en de domains. Hiermee bouw ik daarna een nieuwe CookieContainer die ik voor elke request op de webservice wil gebruiken om de gebruiker te authenticeren:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public CookieContainer GetCookies(string[] cookieNames, string[] cookieValues, string[] cookieDomains) { var container = new CookieContainer(); var uri = new Uri("http://members.iracing.com"); var length = cookieNames.Length; if (cookieValues.Length == length && cookieDomains.Length == length) { for (int i = 0; i < length; i++) { var cookie = new Cookie(cookieNames[i], cookieValues[i]); cookie.Domain = domains[i]; container.Add(uri, cookie); } } return container; } |
Nu ik dit ga testen lijkt het echter niet te werken om een hele stomme reden. Stel dat ik de gebruiker een lijst met threads wil tonen een bepaalde URL. De webservice zou dan de html source van die pagina moeten downloaden, echter zie ik dmv debuggen dat hij een heel andere pagina voorgeschoteld krijgt: namelijk een (andere) login pagina met een waarschuwing dat ik Javascript aan moet zetten...
Het lijkt er dus op dat de website denkt dat ik geen Javascript heb draaien. Nou ja, "ik" ben nou eenmaal geen browser maar een simpele HttpWebRequest, dus daar kan ik inkomen. Het vreemde is nu dat dit wel werkt als ik de webservice lokaal aan het debuggen ben!!
Als ik mijn project debug en gewoon via het ingebouwde webservice 'test formulier' de parameters ingeef, dan krijg ik netjes de juiste pagina source te zien. De cookie parameters haal ik dan rechtstreeks uit de Android app (die heb ik op de achtergrond in debug mode draaien en copy/paste daar gewoon de cookie names, values en domains uit). Voor zover ik kan zien ben ik dus exact hetzelfde aan het doen als in een live omgeving met het enige verschil dat de webservice nu lokaal draait en niet op mijn webserver (wel exact dezelfde code), en op die manier werkt het wel, ik word niet doorgelinkt naar een 'please enable javascript' site en ik krijg alles gewoon mooi door. Zodra ik de code op m'n webserver zet en met dezelfde parameters aanroep werkt het niet meer en gaat hij dus zeuren dat ik geen javascript heb.
Wat kan voor dit verschil zorgen? Mis ik bepaalde cookies die gebruikt worden om te bepalen of javascript enabled is of niet? Als ik het forum met Chrome benader terwijl de Developer Tools draaien (waarmee ik de cookies kan inzien) dan zie ik wel vergelijkbare cookies maar niet exact dezelfde.
Heeft iemand enig idee waar dit aan kan liggen en wat ik er aan kan doen om niet doorgestuurd te worden naar de 'enable javascript' pagina?
Bedankt!