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.