2013-03-11 8 views
26

Ho un'app Rails-API. Più o meno "out of the box", ma voglio aggiungere nuovamente il session store basato sui cookie. Ecco quello che ho fatto:Aggiunta di cookie session store all'app Rails API

app/controller/application_controller.rb

+ include ::ActionController::Cookies 

config/application.rb

+ config.middleware.insert_after ActiveRecord::QueryCache, ActionDispatch::Cookies 
+ config.middleware.insert_after ActionDispatch::Cookies, ActionDispatch::Session::CookieStore 

creato config/inizializzatori/secret_token.rb

+ Namespace::Application.config.secret_token = 'token' 

creato config/inizializzatori/session_store.rb

+ Namespace::Application.config.session_store :cookie_store, :key => '_namespace_key' 

Quando ho ispezionare la sessione in un controller risulta:

<Rack::Session::Abstract::SessionHash:0x3fdadc5daa24 not yet loaded> 

Tuttavia, non sembra che i dati vengono scritti e usate.

Ma, nel mio browser il cookie stesso viene chiamato come '_session_id' invece di '_namespace_key'

ho pensato che ho aggiunto indietro ogni pezzo richiesto per lo stoccaggio cookie di sessione basata, ma sembrano essere manca qualcos'altro . Qualche idea?

+0

Ho anche lo stesso problema, hai disabilitato 'api_only' alla fine? sembra che non sia una buona soluzione .. – Zennichimaro

risposta

12

è necessario rimuovere queste dichiarazioni middleware dal file application.rb e aggiungere questo:

config.api_only = false 

Ciò consentirà la gestione delle sessioni nel modo desiderato, se c'è un configurato session_store da qualche parte nel vostro inizializzatori (che avete) . Questo non è chiaramente documentato, but that's what you're supposed to do.

Esempio here.

+10

Mentre questo può risolvere il problema, non ha molto senso farlo. Io uso rails-api per mantenere il mio stack sottile e ordinato. L'impostazione di 'config.api_only = false' dice essenzialmente di usare solo lo stack regolare e completo di Rails. ... nel qual caso, non ha senso usare rails-api. – turboladen

+2

@turboladen ha ragione: questo elimina lo scopo dell'utilizzo di rails-api. Se vuoi includere solo il middleware specifico, con opzioni specifiche, c'è un modo molto pulito per farlo - allo stesso modo in cui lo stesso rails-api lo fa [qui] (https://github.com/rails-api/rails- api/blob/v0.4.0/lib/rails-api/application/default_rails_four_middleware_stack.rb # L13) –

+1

Santo schifo! Lodate il signore per questa domanda e risposta! Dopo ore di codice di tracciamento, ero quasi pronto a strangolarmi, cercando di capire perché il # $% ^! non stava usando le mie session_options! ;) Ho intenzione di aggiungere un'opzione alternativa a questa risposta nel caso in cui la gente non voglia disabilitare 'api_only'. – mltsy

6

Questa linea viene ignorata perché non si utilizza Rails stack completo:

::Rails.application.config.session_store :cookie_store, 
    :key => '_namespace_key' 

Così, invece, la sessione utilizza la sessione predefinita chiave set here. Tuttavia, è possibile passare questi argomenti direttamente sostituendo:

config.middleware.insert_after 
    ActionDispatch::Cookies, ActionDispatch::Session::CookieStore 

con:

config.middleware.insert_after 
    ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, 
    :key => '_namespace_key' 

Ecco a full list of options you can pass (con una vaga idea di valori predefiniti, in quanto alcuni possono essere sovrascritti dai moduli in Rails).

26

Se siete on Rails 5, e si desidera conservare config.api_only = true si potrebbe estendere il middleware per aggiungere il livello sessioni, aggiungendo questo codice dopo class Application < Rails::Application in config/application.rb

config.middleware.use ActionDispatch::Cookies 
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key' 

Questo potrebbe tornare utile quando si desidera per avere un'app abilitata alle guide api-only ma devi gestire le sessioni utente con un pannello di amministrazione come ActiveAdmin o Rails_Admin.

+1

Per abilitare ActiveAdmin su un Rails 5 App per le API, devi eseguire alcuni altri passaggi oltre a quelli precedenti. Nello specifico, devi creare 2 controller di base, uno per ActiveAdmin che eredita da "ActionController :: Base" e un altro per i tuoi controller API che eredita da "ActionController :: API". Sono necessari anche altri pezzi di middleware per ottenere il rendering delle visualizzazioni della dashboard. Ho scritto [una guida] (http://www.carlosramireziii.com/how-to-add-active-admin-to-a-rails-5-api-application.html?utm_source=stackoverflow) con tutti i passaggi. Spero possa aiutare! –

+0

Potrebbe essere ovvio, ma il 'config.session_store' non è più utile in questo caso; solo questa roba 'config.middleware.use' è richiesta ora. Inoltre, le opzioni come 'chiave: '_namespace_key'' dovrebbero essere spostate nelle istruzioni' config.middleware.use'. –

+0

In base a questo [problema di Rails] (https://github.com/rails/rails/issues/24239#issuecomment-199409912), potrebbe essere necessario anche "includere AbstractController :: Helpers" e "include ActionController :: Cookies". nel controller oltre a abilitare il middleware. – Epigene

Problemi correlati