4 Stimmen

Wie man den unendlichen Sitzungsschlüssel von Facebook direkt nach der Gewährung des Offline-Zugriffs mit dem Facebook Developer Toolkit erhält

Ich verwende die Version 3.0 des Facebook Developer Toolkits, um eine MVC-iframe-Facebook-App zu erstellen, und habe einige Probleme, den unendlichen Sitzungsschlüssel zu erhalten, unmittelbar nachdem er gewährt wird.

Wenn der Benutzer zum ersten Mal die Ansicht mit den Anwendungseinstellungen aufruft, um seine Einstellungen festzulegen, hat er nur den üblichen ablaufenden Sitzungsschlüssel von Facebook. Das ist kein Problem.

Je nach den von ihnen gewählten Einstellungen fordere ich sie mit der Methode FB.Connect.showPermissionDialog der Facebook-Javascript-Client-Bibliothek auf, die erweiterte Berechtigung offline_access zu erteilen. Auch hier kein Problem, sie erteilen die Erlaubnis.

Zu diesem Zeitpunkt wird ein neuer, nicht ablaufender (unendlicher) Sitzungsschlüssel ausgegeben. Diesen muss ich in meiner Datenbank zur späteren Verwendung speichern. Das Problem ist, dass ich nicht herausfinden kann, wie ich ihn sofort bekomme, wenn ich ihn brauche. Die Facebook-Cookies, die die Sitzungsinformationen enthalten, werden erst nach einigen weiteren Seitenaufrufen aktualisiert.

Es gibt einen offenen Fehler im Facebook-Bugtracker unter der Fehler-ID 6421 in diesem Zusammenhang, aber ich bin auf der Suche nach einer Server-seitigen Lösung mit dem Facebook Developer Toolkit 3.0 Release. Ich möchte einen Weg, um die FDT api zu sagen, zu Facebook zu gehen und die neue Sitzung zu erhalten.

Ich weiß, dass die neue Sitzung auf der Facebook-Seite eingerichtet ist. Es gibt ein verräterisches GET auf http://www.facebook.com/extern/login_status.php die im Firebug-Net-Panel angezeigt wird, unmittelbar nachdem der Benutzer die offline_access-Berechtigung erteilt hat, und eine Antwort mit etwas Javascript, das den neuen, nicht ablaufenden Sitzungsschlüssel enthält. Und wenn ich weiterhin den alten ablaufenden Sitzungsschlüssel verwende, erhalte ich ungültige Sitzungsfehler von Facebook zurück.

In meinem Controller habe ich Code wie:

[AcceptVerbs(HttpVerbs.Post)]
[FacebookAuthorization(IsFbml = false)]
public ActionResult Index(FormCollection collection)
{
        var api = this.GetApi();
        var userid = api.Session.UserId;
        var key = api.Session.SessionKey;
}

Damit wird der alte SessionKey abgerufen, nicht der neue, nicht ablaufende.

Ich habe dieses Problem nicht, wenn ich meine ActionResult mit ExtendedPermissions="offline_access" auf der GET dekorieren, zwingt den Benutzer, die offline_access vor sogar sehen die Seite zu gewähren, aber ich mag nicht, dass Benutzererfahrung. Ich viel lieber mit Javascript nur bei Bedarf auffordern, und die Javascript-Berechtigungen Lightbox ist viel schöner als die volle Seitenbreite Berechtigungen auffordern, wenn ich ExtendedPermissions="offline_access" verwenden.

Ich habe auch versucht, den Aufruf meiner xd_receiver abzufangen (die ich eine Ansicht gemacht habe, so dass ich einen Debugger-Haltepunkt in seinem Controller treffen und die eingehende Anforderung von Facebook überprüfen kann). Es wird während der Gewährung der erweiterten Berechtigung getroffen, aber wieder hat es die alte ablaufende Sitzung Info verwiesen.

Um es noch einmal zusammenzufassen: Ich suche nach einer Möglichkeit, mit dem Facebook Developer Toolkit eine Sitzungsaktualisierung von Facebook zu erzwingen und den neuen unendlichen Sitzungsschlüssel (und das Geheimnis) zu erhalten.

0 Stimmen

Ich würde zwar eine Lösung mit der FDT-Api bevorzugen, aber der Ansatz, den ich versuchen werde, ist die Durchführung eines GET auf facebook.com/extern/login_status.php in meinem Controller. Ich habe nicht bekommen, dies in der Vergangenheit zu arbeiten, aber ich denke, vielleicht muss ich alle Cookies übergeben, die ich sehe, gesendet werden, wenn ich die GET geschieht in Firebug sehen. Wenn das nicht klappt, erwäge ich eine Art von hässlichen Brute-Force-Methode wie erzwingen Seite aktualisiert, nachdem Sie die offline_access Berechtigungen, bis ich einen Sitzungsschlüssel mit expires == 0 erhalten, aber das wird ein letzter Ansatz sein.

0 Stimmen

Ich habe versucht, meinen eigenen Aufruf der Facebook login_status.php Url zu machen, aber leider funktioniert es nur, wenn ich Cookies übergebe, die in der facebook.com Domain sind. Ich glaube, das geht nicht, da ich aus Sicherheitsgründen nicht an diese Daten herankomme...oder? Zu Testzwecken habe ich einfach die Cookie-Werte in meinen Code kopiert und eingefügt, um den Aufruf zu machen, und es funktioniert eine Weile, bis sich die Cookie-Werte ändern. Und natürlich komme ich programmatisch nicht an die Daten heran. Ergeben sich aus diesen neuen Informationen noch andere Möglichkeiten, die ich Ihrer Meinung nach ausprobieren sollte?

0 Stimmen

Es sieht immer mehr danach aus, dass es sich um einen Fehler in der Facebook-API für den Umgang mit dem Sitzungsstatus und deren Abhängigkeit von Cookies handelt. Siehe Facebook-Fehler 6421. Ich verfolge eine Lösung mit der neuen Facebook Alpha Javascript-Client-Bibliothek, die Unterstützung für Cookie-losen Sitzungsstatus-Management hat. Wenn ich das Problem löse, werde ich diese Frage aktualisieren.

5voto

Pat James Punkte 4348

Ich hasse es, meine eigene Frage zu beantworten, aber es ist besser, als keine Lösung zu haben. Hoffentlich hilft das jemand anderem.

Die Hauptursache für das Problem ist, dass die Cookies nicht rechtzeitig mit der neuen Sitzung aktualisiert werden, oder bis die Seite neu geladen wird. Laut Facebook-Entwickler ist dies ein Browser-Problem. Alle Facebook-Client-Bibliotheken, einschließlich des .NET Facebook Developer Toolkit, verlassen sich auf die Cookies für Sitzungsinformationen. Es handelt sich also um einen Browser-Bug, einen Facebook-Bug oder einen Facebook-Design-Fehler, der eine so große Abhängigkeit von den Cookies verursacht. Siehe Facebook-Fehler 6421.

Glücklicherweise hat Facebook eine neue Javascript-Client-Bibliothek in der Alpha-Phase, die eine Cookie-freie Option hat, die funktioniert.

<div id="fb-root"></div>
<script type="text/javascript"
    src="http://static.ak.fbcdn.net/connect/en_US/core.js">
</script>

<script type="text/javascript" >

    // initialize the library with the API key, set cookie: false
    FB.init({
        apiKey: your_facebook_apikey,
        cookie: false,
    });

    FB.getLoginStatus(function(response) {
        if (response.session) {
            alert(response.session.session_key);
        } else {
            // re-prompt for permissions or do some other exception handling
        }
    }, true); // critical optional parameter to force a refresh

</script>

(aus Gründen der Kürze lassen wir die Aufforderungen zur Erteilung von Facebook-Berechtigungen und andere Dinge weg)

In meiner MVC-App fordere ich in Javascript Berechtigungen an. Vor dem Absenden meines Formulars führe ich den Aufruf getLoginStatus aus und gebe den Sitzungsschlüssel und das Geheimnis in Formularfelder ein, damit sie an den Controller gesendet werden.

Die neue Javascript-Client-Bibliothek ist auf github unter http://github.com/facebook/connect-js

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X