Sessie niet opgeslagen op subdomein

  • Hallo allemaal,


    Ik heb een probleem bij een van mijn projecten bij het inloggen.
    Ik werk met een PHP Api (die draait op api.domain.com) en een AngularJs front end applicatie (domain.com).


    Wanneer ik probeer in te loggen, doe ik met Angular een request naar mijn Api. Ik stuur dus vanuit mijn applicatie (domain.com) een request naar mijn Api (api.domain.com). Wanneer de inloggegevens juist zijn, moet er een sessie worden gestart. Dit gebeurt alleen niet..


    Wat ik heb geprobeerd:
    Toegevoegd in Api:

    PHP
    session_set_cookie_params(86400, '/tmp', '.domain.com', true);
    session_start();
    header("Access-Control-Allow-Origin: https://domain.com");

    Heeft iemand misschien ideeën waar het aan zou kunnen liggen?

  • Guest, wil je besparen op je domeinnamen? (ad)
  • Client side wordt er gecontroleerd of je nog ingelogd bent. Nadat ik ben ingelogd, navigeer ik naar een andere pagina. Daar krijg ik geen session als resultaat.


    Voor debug heb ik de session array als resultaat terug gestuurd bij het inloggen en het ophalen van je persoonlijke profiel. Bij het inloggen krijg ik de sessie terug (opgeslagen), haal ik vervolgens mijn profiel op, dan is de sessie weg.

  • Waarom geen sessie systeem aan de hand van een key/Database. Bijvoorbeeld naar een halfuur geen activiteit de sessie eruit gooien. Zoiets als:


    table_sessions:
    [sessie_id] - Unieke id
    [sessie_user_id] - De gebruikers id
    [sessie_key] - De unieke sessie key
    [sessie_time_update] - De laatste activiteit van de user.
    [sessie_time_start] - Wanneer de sessie begonnen is.


    Ongeveer zo, en aan de hand van sessie_time_update zou je dan de user na een halfuur eruit kunnen gooien.


    Wat betreft sessies op backend van de client weet ik niet of dit zal werken met $_SESSION, omdat backend niet open blijft en dus de sessie vervalt. (Cookies zou misschien kunnen, geen ervaringen mee)

    PHP, JAVA, C#, JAVASCRIPT, HTML(5), CSS(3) developer.
    Vragen?! Stuur me gerust een prive bericht :) !

  • Nadat ik ben ingelogd, navigeer ik naar een andere pagina. Daar krijg ik geen session als resultaat.

    Bevindt deze andere pagina zich in het pad /tmp, oftewel, navigeer je naar iets van de vorm http(s)://domain.com/tmp? Want dat (die, en onderliggende directories) is het geldigheidsdomein wat je instelt voor je sessie-cookie middels session_set_cookie_params(). Daarbuiten "bestaat" deze niet.


    Je zou altijd je cookies kunnen inspecteren via je browser. Grote kans dat daar dan gewoon een sessie-cookie tussenstaat met path "/tmp".

  • @FangorN Het pad klopte inderdaad niet, maar met alleen / werkt het ook niet. Ik dacht in eerste instantie dat dit naar de home directory zou gaan, buiten de web directory.



    Ik kom wel een cookie tegen (PHPSESSID), met wat je inderdaad zei, /tmp als path. Nu dus /.


    Het gekke is dat als ik de sessie gewoon zet in een GET van de API, de sessie wel wordt opgeslagen, zoals hieronder:

    PHP
    $_SESSION["name"] = 1;

    Maar wanneer ik een POST request naar de API stuur, waar dezelfde code wordt uitgevoerd, wordt dit niet opgeslagen.



    @T.Nijborg
    Dit zou inderdaad kunnen, maar het is een extra call naar de database en wellicht ook onveiliger. Met de PHPSESSID cookie zou je dan op session_key kunnen zoeken, dat was je bedoeling toch? De cookie zou je ook zelf kunnen maken. De kans dat je een session_key goed hebt gegokt die ook nog geldig is, is nogal klein. Toch is die aanwezig denk ik.
    Als ik er niet uitkom, kan ik dit toch nog toepassen. Hier moet ik nog even over nadenken..

  • Maar wanneer ik een POST request naar de API stuur, waar dezelfde code wordt uitgevoerd, wordt dit niet opgeslagen.

    Dan zou ik daar eens naar kijken :).


    De cookie zou je ook zelf kunnen maken. De kans dat je een session_key goed hebt gegokt die ook nog geldig is, is nogal klein. Toch is die aanwezig denk ik.

    Daarom zul je aanvullende voorzieningen moeten treffen waarmee je met grotere zekerheid kunt stellen dat je met een zekere gebruiker van doen hebt. Enkel een sessie-id lijkt mij sowieso niet echt verstandig/voldoende voor deze check.


    Misschien kun je op een of andere manier makkelijk gebruik maken van het feit dat je HTTPS gebruikt - al het dataverkeer wordt encrypted verstuurd/ontvangen. Je zult dan waarschijnlijk wel (extra) informatie moeten onthouden zodat je dingen kunt controleren, dus ik denk dat je dan toch (deels) aangewezen bent op de gebruikmaking van een database.


    Ook lijkt het mij verstandiger om elke page-access de database te raadplegen om te kijken wat de status van een gebruiker is. Indien je deze informatie (rol, privileges etc.) in je sessie opslaat kun je hier niet direct op acteren, maar zul je moeten wachten totdat de sessie getimeout is of dat een gebruiker uitlogt. Of je moet functionaliteit hebben die iemand geforceerd uitlogt, maar dat lijkt mij de verkeerde insteek (borduurt verder op een andere tekortkoming: het "blijven hangen" van informatie in je sessie).

  • Het is me nu gelukt, ik heb het op een soortgelijke manier gedaan zoals T.Nijborg aangaf. Het ID van de sessie wordt encrypted opgeslagen, om nog wat extra op de veiligheid te letten. Met het decrypted ID, die voor iedereen anders is en alleen jij die van jezelf hebt, kan er een request worden gedaan om je eigen profiel op te halen. Dat ID wordt ook gecontroleerd in de database of de sessie nog geldig is.

  • Dit lijkt me allemaal nogal complex.
    http://culttt.com/2013/02/04/h…p-sessions-to-a-database/
    Sessie rechstreeks opslaan in de database.

    Dat artikel, evenals het artikel waar daarin naar verwezen wordt, is interessant maar er zijn wel enkele "caveats", gotcha's en (mogelijk) enkele regelrechte fouten waar je op moet letten.


    Indien gewenst kan ik (hier of via PM) inhoudelijk nog veel meer over zeggen, maar het voornaamste wat mij tegenstaat in de bovenstaande implementatie is het volgende:


    Ik houd er niet van als mijn klasses "op scherp" staan, in die zin dat er allerlei zaken automatisch worden uitgevoerd bij de creatie van een object. Wanneer een object aangemaakt wordt zouden er enkel zaken geïnitialiseerd moeten worden, maar NIET uitgevoerd! Na afloop van de initialisatie van een object zou dit object enkel "klaar voor gebruik" moeten zijn, maar verder nog niets "gedaan" moeten hebben. In de constructor van het object gebeuren er twee dingen die ik op een andere manier en op een andere plaats zou aanpakken / regelen:

    • de start van een sessie
    • het opzetten van een database-connectie

    Ik wil zelf bepalen wanneer ik mijn sessie start. De sessie-handler zou enkel in de implementatie van het sessie-management moeten voorzien, maar niet eigenhandig moeten besluiten wanneer de sessie wordt gestart. Ik zou session_start() dan ook verwijderen uit de constructor.


    Daarnaast lijkt het mij beter dat je een bestaande database-connectie doorgeeft aan de constructor. Het is niet de taak van de sessie-handler om een andere/tweede connectie op te zetten met een database... Daarnaast is het opzetten van een (tweede) connectie een dure operatie en kan mogelijk voor problemen zorgen met de ondeelbaarheid van querybatches (transacties).


    En tot slot (observatie): het hele doel van die class is dat deze het sessie-management onder water regelt en dat je sessie-gerelateerde code op de ouderwetse manier blijft gebruiken (de aanroep van session_-functies en het gebruik van $_SESSION). Het is dus eigenlijk helemaal niet de bedoeling dat je iets doet via het object van die klasse, het object zou dan ook niet beschikbaar moeten zijn.


    Initialisatie van deze functionaliteit zou er dus min of meer als volgt uit moeten zien:

  • Het meeste geef ik je gelijk in enkel die seesion_start niet oùdat als je die class include je sessies wilt gebruiken.
    Anders moet je die class niet includen.
    Ook is er kan ik niet echt een reden bedenken om dit niet rechtstreeks te wensen.

  • Het meeste geef ik je gelijk in enkel die seesion_start niet oùdat als je die class include je sessies wilt gebruiken.
    Anders moet je die class niet includen.
    Ook is er kan ik niet echt een reden bedenken om dit niet rechtstreeks te wensen.


    De class verzorgt de afhandeling /verwerking van sessie-opslag. Dit alles gebeurt onder water. Wanneer je session_-functies aanroept of $_SESSION gebruikt heb je er geen weet van hoe dit achter de schermen geregeld wordt en dit hoeft ook niet want dit is in zekere zin abstractie. Wat mij betreft is het dan ook niet aan de klasse om bij het instellen van het type afhandeling van sessies het startsignaal te geven voor het starten/voortzetten van een sessie zelf.


    Vergelijk het met de default implementatie van de sessionhandler: daar roep je ook altijd eerst session_start() aan. Pas je deze default session handler aan dan zou dat voor de overige code niet uit moeten/mogen maken. De session handler zelf zou dan ook niet eigenhandig een sessie moeten starten, deze schrijft enkel voor hoe een en ander administratief (en onder water) wordt afgehandeld.


    Session handlers zouden ook "vrij inwisselbaar" moeten zijn zonder dat deze van invloed is op andere code. Ook om die reden hoort session_start() niet in de handler zelf thuis: dit zou namelijk inhouden dat je voor sommige implementaties session_start() in andere code zou moeten toevoegen en in andere implementaties achterwege kunt laten. In dat geval zou de ene handler niet zonder meer uitgewisseld kunnen worden voor een andere.


    Long story short: het starten/voortzetten van een sessie regel je simpelweg niet in de handler zelf omdat dat niet de taak is van een session handler :p.


    Oh, nog een argument: je zou sessie-instellingen dan ook in de constructor moeten opnemen/doorgeven (of moeten instellen voordat je een object creëert) omdat je deze voor het starten van de sessie moet instellen. Hiermee leg je een additionele eis op aan de volgorde waarin dingen geregeld moeten worden. Het wordt dan allemaal steeds minder transparant/intuïtief en gaat ook voorbij aan de scope van wat een session handler zou moeten doen...

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!