2016-05-03 14 views
0

Ich habe eine Anwendung in Schienen, die stark auf facebook oauth2 basiert. Auf einen Blick - der Benutzer meldet sich mit FB connect an und kann seine Seiten auflisten (und einige Daten mit diesen Daten erledigen, aber das ist im Moment nicht wichtig. Konzentrieren wir uns einfach auf das Anmelden und das Abrufen der Seitenliste).Refreshing Benutzer Facebook Tokens

Nach einer Anmeldung speichere ich Benutzer access_token und expires_at in der Datenbank. Jedes Mal, wenn ich eine Anfrage an facebook api als Benutzer stellen muss (um seine Seitenliste zu erhalten), überprüfe ich, ob expires_at nicht abgelaufen ist. Wenn ja, aktualisiere ich das Benutzer-Token mit einem folgenden Ausschnitt:

def refresh_facebook_token 
    # Checks the saved expiry time against the current time 
    return unless facebook_token_expired? 

    # Get the new token 
    new_token = facebook_oauth.exchange_access_token_info(
     old_access_token) 

    # Save the new token and its expiry over the old one 
    self.facebook_auth = { 
     uid:   uid, 
     access_token: new_token['access_token'], 
     expires_at: Time.now + new_token['expires'].to_i 
    } 
    save 
    end 

Dies funktioniert die meiste Zeit, aber von Zeit zu Zeit, meinen Code wirft:

Typ: OAuthException, Code: 190, error_subcode: 460 Nachricht: Fehler beim Überprüfen der Token-Zugriff: Session tut stimmt nicht mit der aktuellen gespeicherten Sitzung überein. Dies kann daran liegen, dass der Benutzer das Passwort seit der Erstellung der Sitzung geändert hat oder dass Facebook die Sitzung aus Sicherheitsgründen geändert hat. [HTTP 400]

in Übereinstimmung mit exchange_access_token_info.

Dieser Fehler wird für meinen eigenen Benutzer ausgelöst, und ich kann sagen, dass ich das Passwort nicht geändert habe, also bin ich nicht sicher, was das verursacht und wie kann ich mit der Aktualisierung der Tokens durch Back-End in einem kugelsicheren umgehen Weg.

Jede Hilfe sehr geschätzt!

Antwort

1

Zunächst würde ich empfehlen, gehen Sie durch this link und entscheiden, welche Konfiguration für Ihre Anwendung sinnvoll ist - mit kurzlebigen oder langlebigen oder was.

Jetzt bin ich mir nicht sicher, aber ich denke, dass Sie die Methode exchange_access_token_info als Token Refresher betrachten. Wenn ja, ist das NICHT der Fall! Sobald ein Token abgelaufen ist, ist es nutzlos. exchange_access_token_info Methode dauert einfach das kurzlebige Token (die derzeit aktiv ist) und konvertieren Sie es in die langlebige Token mit App-ID und geheimen.

verstehen Gerade dass-

Der Benutzer Zugriffstoken kann nicht unendlich wieder verlängert werden und wieder ohne Interaktion des Benutzers mit der App für 60 Tage.

So ist die Strömung sehr einfach-

  • Sie die kurzlebigen Token erhalten, wenn Benutzer (Engagement Benutzer auf Front-End) Ihre Anwendung authentifizieren
  • auf serverseitige Sie die Tokens erweitern Gültigkeit bis 60 Tage.
  • möchte die Token-Gültigkeit erneut verlängern? - Wiederholen Sie die Schritte.

Hoffe, dass hilft!