WN

WN (https://www.wn.se/forum/index.php)
-   Klientsidans teknologier, design och grafik (https://www.wn.se/forum/forumdisplay.php?f=12)
-   -   Facebook Connect - Stänga inloggningspopup (https://www.wn.se/forum/showthread.php?t=1039845)

peterbf 2010-01-04 22:18

Facebook Connect - Stänga inloggningspopup
 
Tjenare!

Använder Facebook Connect för att möjliggöra enklare registrering och inloggning för Facebook-användare.

Ni som testat Facebook Connect kanske känner igen min problematik.

När man skrivit in korrekta inloggningsuppgifter i popupen så skickas man ju tillbaka till sin Facebook Connect URL där man loggar in eller registrerar användaren mot sin egen databas. Detta fungerar utmärkt och kontot skapas utan problem.

Men nu till problemet.

När man skickas tillbaka till Facebook Connect URL:en så vill man efter inloggningsautensieringen att popupen ska stängas och parent-fönstret (window.opener) ska anropa reload() så man ser att man är inloggad.

I dagsläget kan jag bara anropa window.close() som fungerar.
Anropar jag window.opener så har jag ingen åtkomst, inte heller window.opener.opener.

Jag har kollat allt detta i Internet Explorers utvecklingsverktyg.

Så det verkar inte som att knappen man får av Facebook använder sig av window.open (som gör att man kommer åt window.opener från popup-fönstret) vilket skapar ett problem:

Hur ska jag kunna anropa reload() när jag inte kan få tag i mitt parent-fönster som öppnade facebooks inloggningspopup?

nord84 2010-01-05 17:13

Är delaktig i samma projekt.

Problemet kort och gott:
När man loggar in i Facebook Connect popupen vill man att den stängs automatiskt när man klickat på "Connect" knappen (motsvarar en "logga in knapp").

Detta fungerar inte nu... utan man blir inloggad och får surfa runt i själva popupen istället.. Hur gör man?

peterbf 2010-01-07 09:09

Nån här på WN måste väl ha testat Facebook Connect? :)

Jonas 2010-01-07 09:36

Finns det någon länk så man kan se själv?

peterbf 2010-01-07 13:44

Det är sekretess på projektet, så tyvärr.

Men är det svårt och förstå?

Anders Larsson 2010-01-08 00:19

Kanske inte så svårt att förstå, men om du kan återskapa problemet och lägga upp (bara dummy, inte kopplat till projektet) kan vi titta på det.

Har satt upp flera Connect-sajter, men känner inte alls igen problemet.

Connect-popupen kommer när man ska godkänna en webbsida alt när man ska logga in. När man klickar igenom popuppen stängs den och grundsidan laddas om.

Har ni förresten satt reloadIfSessionStateChanged?

peterbf 2010-01-08 10:15

Hej, Anders!

Jag har denna kod i min MasterPage:
FB.init("Min-API-Nyckel", "http://Min-Webbplats.com", { "reloadIfSessionStateChanged": true });

Anders Larsson 2010-01-08 21:45

Citat:

Ursprungligen postat av peterbf (Inlägg 20338227)
Jag har denna kod i min MasterPage:
FB.init("Min-API-Nyckel", "http://Min-Webbplats.com", { "reloadIfSessionStateChanged": true });

Men du menar alltså att efter conect/inloggning har du fortfarande kvar popup-rutan och att din sajt öppnas i den rutan? Eller missuppfattade jag dig.

nord84 2010-01-08 23:17

Du har förstått helt rätt Anders. Någon idé?

Anders Larsson 2010-01-09 12:10

Citat:

Ursprungligen postat av nord84 (Inlägg 20338340)
Du har förstått helt rätt Anders. Någon idé?

Att något är fel, för så ska det inte fungera. Kontrollera att API-nycklar och URL:er är korrekta.

Tänk på att det är skillnad på www.domän.se och domän.se om du inte satt "base domain" i inställningarna.

peterbf 2010-01-11 09:47

Testade radera alla filer som har med Facebook Connect och göra. Sen gjorde jag om processen igen.

Nu så stängs popupen efter responsen från Facebook, men sidan jag var på när jag klickade upp inloggningspopup:en, laddas _inte_ om.

Jag har ingen 'base url' då jag inte behöver använda mig av FBC på flera subdomäner.

Vad kan problemet vara nu och vad kan jag göra för att felsöka det på det mest informativa tillvägagångssättet?

peterbf 2010-01-11 11:47

Upplever lite av ett problem nu.

Har testat lite olika javascript från Facebook Community.
Saken är den att jag ser om inloggningsuppgifterna är korrekta i min MasterPage, därefter skapar jag sessioner osv. Men när facebook stänger popupen och fyller min <div id="user" /> med användarinfo (på klientsidan givetvis), och jag laddar om sidan, så är jag inte inloggad (på serversidan givetvis).

Mitt javascript ser ut såhär:
Kod:

        FB_RequireFeatures(["XFBML"], function() {
            FB.init("9afc553810bcd6aeef3ecdbd72a8b48a", "http://Min-Domän.com/xd_receiver.htm");
            FB.Facebook.get_sessionState().waitUntilReady(function() {
                FB.Connect.ifUserConnected(update_user_box);

            });
        });

        function update_user_box() {
            var user_box = J("#user");

            user_box.append(
            "<span>"
            + "<fb:profile-pic uid='loggedinuser' facebook-logo='true'></fb:profile-pic>"
            + "Welcome <fb:name uid='loggedinuser'></fb:name>"
            + "You are signed in with your facebook account."
            + "</span>");

            FB.XFBML.Host.parseDomTree();
        }

Så om man loggar in så visas användaruppgifterna mha. JavaScript, så det funkar, men inte serversidans validering - vilket givetvis är ett måste då alla medlemmar sparas i databasen.

Jag läser av uppgifterna såhär:

Kod:

        FBConnectAuthentication auth = new FBConnectAuthentication(ConnectAuthentication.ApiKey, ConnectAuthentication.SecretKey);
        if (auth.Validate() != ValidationState.Valid)
        {
            //Response.Redirect("/Default.aspx");
            // The request does not contain the details of a valid Facebook connect session - you'll probably want to throw an error here.
        }
        else if (!String.IsNullOrEmpty(Request.QueryString["session"]))
        {
            FBConnectSession fbSession = auth.GetSession();
            string userId = fbSession.UserID;
            string sessionKey = fbSession.SessionKey;
       
            Facebook.Schema.user user = p.Api.Users.GetInfo(long.Parse(userId));

            if (user != null)
            {

                var friends = p.Api.Friends.Get(long.Parse(userId));

                string FirstName = user.first_name;
                string LastName = user.last_name;
         
                string ShortenLastName = string.Empty;
                string UsernameTry = string.Empty;

                UsernameTry = GenerateUserNameWithNumbers(FirstName);

                UsernameTry = UsernameTry.Trim();

                if (LoginUser(userId))
                {

                    if (CurrentUser.IsFromFacebook)
                    {
                        if (!CurrentUser.IsFacebookEmailActivated)
                        {
                            Response.Redirect("/User/ActivateAccount.aspx");
                        }

                    }
                }

                if (Celpocket.Profile.UserExists(userId))
                {
                    UsernameTry = GenerateUserNameWithNumbers(FirstName);
                }

                bllCreateAccount.CreateAccount(UsernameTry, userId, RandomPassword.Generate(10), FirstName, LastName, user.birthday_date);

                if (LoginUser(userId))
                {

                    if (CurrentUser.IsFromFacebook)
                    {
                        if (!CurrentUser.IsFacebookEmailActivated)
                        {
                            Response.Redirect("/User/ActivateAccount.aspx");
                        }
                    }
                }
            }
        }

Men den stänger ju popupen direkt nu? Lever sessionen från ett annat fönster (som popupen är)?

peterbf 2010-01-11 12:34

Det mesta funkar som det ska nu... Men jag har problem med en sista grej, och det är ett litet litet JavaScript-block som ser ut som följer:

Kod:

        FB_RequireFeatures(["XFBML"], function() {
            FB.init("9afc553810bcd6aeef3ecdbd72a8b48a", "http://MinDomän.com/xd_receiver.htm");
            FB.Facebook.get_sessionState().waitUntilReady(function() {

                    window.location.href = window.location.href;
                    FB.Connect.ifUserConnected(update_user_box);
               
            });
        });

Detta är för att jag vill göra en reload när popupen stängs, och det funkar perfa. Man ser att man är inloggad på serversidan och att ett konto, inkorg och gästbok o.s.v. skapats.

Men det som ju naturligtvis sker är att den gör en reload hela tiden, den stoppar aldrig.
Jag testade definiera en variabel med värdet '0' innan funktionen, och sen öka den med variabel++ för att sen se om den är '0' - och då köra reload. Så den bara körs en gång.

Men trög som jag är så när sidan laddas om nollställs ju variabeln såklart...

En annan lösning?

peterbf 2010-01-11 19:22

Löste det med jQuery.cookie().

Sen raderar jag cookien när man loggar ut med facebook-knappen.

peterbf 2010-01-13 09:07

Hej igen!

Jag har min facebook-login-metod i min MasterPage. Jag tittar om QueryString:en ("Do" == "Login"). Då körs koden som loggar in facebook-användaren.

Jag har lagt in denna URL:en i min facebookapplikations inställningar ( Canvas URL ) och även testat lägga in URL:en på alla andra fält där man kan skriva in URL:er i applikationsinställningar, bara för att kontrollera att jag inte missat nåt.

Men facebook når aldrig dit. Jag har inte en aning om varför.

När man loggat in så stängs facebook-login-popupen, sidan laddas om. Men du har inte loggats in på min webbplats.

Däremot, när jag loggat in med mina facebookuppgifter och facebook-login-popupen stängts, så kan jag manuellt skriva in "?Do=Login", och då loggas man in. Men man vill ju att detta ska ske i facebook-login-popupen, eller hur?

Ha en underbar dag!

nord84 2010-01-13 21:26

hmm.. ännu en nöt att knäcka i FBCs underbara värld.

Anders Larsson 2010-01-14 01:42

Använder inte dot.net, så jag har tyvärr ingen möjlighet att komma med mer hjälp.

peterbf 2010-01-14 16:38

Tjänare, Anders!

Detta är inget .NET-specifikt som tur är.

Jag undrar varför inte facebook skickar min till URL:en jag angivit i Canvas-textrutan i application settings på facebook.

Som jag nämnde i förra inlägget har jag testat slänga in http://www.min-sida.com/?Do=Login överallt. Men den går inte dit.

Kanske nån vet varför?

Anders Larsson 2010-01-14 16:58

Du ska inte skickas till den url som står under canvas. Det är inställningar för Facebook Apps, som ligger på apps.facebook.com.

Du ska istället pilla på fliken Connect. Under Connect Url ska du sätta sajtens huvudadress (www.hejsanhopp.se). Sätt base domain om du även tillåter trafik på hejsanhopp.se, annars kommer inte den domänen att fungera.

När du loggas in ska du inte redirectas till en annan sida, utan Facebook tar hand om inloggningen i den popup som kommer, loggar in användaren, sätter lite cookies mha js, stänger rutan och laddar om den sidan som öppnade popupen.

JS+FBAPI på denna sida märker då att du är inloggad.

Har du testat att ladda ner deras connect-demo, running-sajten?

Citat:

Ursprungligen postat av peterbf (Inlägg 20339106)
Tjänare, Anders!

Detta är inget .NET-specifikt som tur är.

Jag undrar varför inte facebook skickar min till URL:en jag angivit i Canvas-textrutan i application settings på facebook.

Som jag nämnde i förra inlägget har jag testat slänga in http://www.min-sida.com/?Do=Login överallt. Men den går inte dit.

Kanske nån vet varför?


peterbf 2010-01-15 08:41

Jag måste fixa server-autensiering. Okej, facebook löser det på klientsidan, men medlemmen måste ju loggas in på mitt community så att säga.

Problemet jag hade när jag hade inloggningskoden direkt i Index-filen, var att om du är inloggad facebook, innan du kommer till min sajt. Så loggas du in per automatik förutsatt att du redan är registrerad på mitt community så att säga.

Därför var jag tvungen att använda en QueryString som bara är till för de användare som loggar in via min sida.

Anders Larsson 2010-01-15 15:37

Jag använder mig av Facebooks PHP-bibliotek, inkluderar och skapar en ny instans av facebook. Har användaren loggats in fixar deras bibliotek resten.

Det är så det fungerar, då måste ju lösa cookies och verifiera att dessa är korrekta, för att serverside veta att användaren är inloggad.

Du ska också bli automatistk inloggad om du redan är inloggad på FB och har connectat med sajten. Det är ju så det är tänkt att fungera, så på vilket sätt är det ett problem? Och om det är ett problem, vad ska du ha connect till?

Staffconsulting 2010-01-15 21:04

Funkar på "vårat" forum iaf..

forum.snowmobile.se

peterbf 2010-01-17 14:16

Tjänare...

Problemet med min kod är att så fort en användare som är inloggad på facebook går in på min sajt, så blir han registrerad på min sida utan att själv välja detta. För jag tittar först om användaren redan finns i databasen, annars registrerar jag honom och loggar in honom därefter ( då detta är anpassat efter sidan man kommer till efter man loggat in via facebook-popup:en ).

http://pastie.org/781748

Därför har jag nu fått lägga in QueryString-kollen på rad 13 för att kolla om det verkligen är en manuell inloggning.

Jag skulle helt enkelt behöva en if-sats med följande logik:

if (Användaren-Loggar-In-Från-Facebook-Popupen)
{
// Kör denna kod.
}

Anders Larsson 2010-01-17 19:56

Användaren blir ju bara inloggad om han/hon tidigare har "connectat" med din sajt. Är det en användare som inte har connectat händer ju ingenting.

Det är så det är tänkt att fungera, så du försöker alltså aktivt att använda det mot hur det är tänkt att fungera.

Alltså, användaren SKA inte få någon popup för att logga in, när de väl har gjort det första gången. Då ska de automat-inloggad, förutsatt att de är inloggade på FB.


Alla tider är GMT +2. Klockan är nu 03:32.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson