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!