2011-01-21 4 views
2

Je veux créer un cookie sécurisé et le signer avec le secret de mon application Facebook que je connais, selon Facebook signed_request. J'ai déjà mis en œuvre un Ruby method that decodes the signed_request sent by Facebook.Facebook Toile d'authentification avec Sinatra: Cookie signé (avec Rack)

Cela fonctionne, mais maintenant, comme le fait runwithfriends, je veux renvoyer au client un cookie qui utilise la même procédure de signature. Je regardais à travers le rack source code, et il semble qu'il offre cette fonctionnalité.

Je me demande toutefois comment faire cela dans Sinatra. Il ressemble à set_cookie est un emballage autour de set_cookie_headers, qui ne semble pas accepter un secret. Donc, je pense que je dois le faire avec Rack. Je vais essayer cela et rendre compte.

En attendant, le Sinatra Book dit qu'il fournit des cookies basés sur la session.

Alors, quelle est alors la différence entre un cookie:

set_cookie("u", 123) 

ou définir une variable de session:

session["u"] = 123 

je me suis retrouvé à creuser à travers le Sinatra & code source Rack. J'ai une idée. Je pense qu'ils sont à peu près les mêmes à part certaines fonctionnalités par défaut.

Répondre

2

Une option.

Je vous recommande d'utiliser une solution "session" côté serveur pour une application Facebook comme celle-ci. https://github.com/jodosha/redis-store par exemple vous donne un objet Sinatra "cache" dans lequel vous pouvez stocker des objets sérialisés. Et vous pouvez définir des expirations pour les clés redis afin que la mémoire ne s'accumule pas trop. Je recommande d'utiliser l'uid facebook comme clé pour le cache de sorte que, quel que soit l'ordinateur/navigateur utilisé par un utilisateur, sa session sera toujours la même. De même, vous n'avez pas à vous soucier de la configuration des cookies dans les iframes, ce qui ne fonctionne pas dans Safari et Chrome.

Avant filtre: @session = cache.fetch("session-#{@uid}") { {} }

Après filtre: cache.set("session-#{@uid}", @session)

Questions connexes