2014-10-01 4 views
6

Sto utilizzando Devise per l'autenticazione nel mio servizio API RESTFul Rails. Devise mi permette di creare un nuovo utente utilizzando [POST] http://domain/users con form_data:Rails: dopo aver definito percorsi di deviazione nello spazio dei nomi, il nome del modello è preceduto dallo spazio dei nomi. Come rimuoverlo?

[user]password = 123 
[user]email = [email protected] 
[user]password_confirmation = 123 

poi ho messo devise_for nel namespace come questo

namespace :api do 
    namespace :v1 do 
    devise_for :users, 
       controllers: { 
        :registrations => 'api/v1/registrations', 
        :sessions => 'api/v1/sessions', 
        :passwords => 'api/v1/passwords' 
       } 
    end 
end 

La struttura dei file di controller simile a questo.

. 
├── api 
│   └── v1 
│    ├── passwords_controller.rb 
│    ├── registrations_controller.rb 
│    └── sessions_controller.rb 
├── application_controller.rb 

Dopo che ho fatto questo cambiamento, dovrei usare [POST] http://domain/api/v1/users per creare un nuovo utente, ma con la seguente form_data

[api_v1_user]password = 123 
[api_v1_user]email = [email protected] 
[api_v1_user]password_confirmation = 123 

Non voglio il nome del modello (cioè utente) a essere prefisso da api_v1_. Perché se un giorno avessi cambiato la mia versione api su v2, allora dovrò aggiornare tutte le mie chiamate API lato client!

Qualche idea?

risposta

6

si può provare la seguente nei vostri percorsi

namespace :api, as: nil do 
    namespace :v1, as: nil do |version| 
    devise_for :users, 
       controllers: { 
        :registrations => "api/#{version}/registrations", 
        :sessions => "api/#{version}/sessions", 
        :passwords => "api/#{version}/passwords" 
       } 
    end 
end 
+0

Grazie, questo funziona davvero! –

2

Partenza escogitare Configuring Routes doc. Puoi ottenerlo personalizzando da solo le rotte API. Ad esempio

namespace :api do 
    namespace :v1 do 
    devise_scope :user do 
    resources :sessions,  defaults: {format: :json} 
    resources :registrations, defaults: {format: :json} 
    end 
end 
end 
0

Sembra che si sta utilizzando personalizzato ideare controllori, così si dovrebbe essere in grado di impostare l'ambito di autenticazione guardia nel controller:

warden.authenticate!(scope: :user) 
0

ho incontrato questo durante il tentativo di utilizzare la gemma Versionist alla versione personalizzata Strategie di autenticazione Devise (Rails 5). Ecco la mia soluzione per configurarlo nella configurazione senza richiedere un controller personalizzato:

/config/initializers/inflections.rb ottiene un inflector in modo che API non continui a presentarsi come Api. è un bel-to-have

ActiveSupport::Inflector.inflections(:en) do |inflect| 
    inflect.acronym 'API' 
end 

routes.rb

api_version(:module => "API::V1",:path => {:value => "api/v1"}) do 
    devise_for :users, 
       :as => :fancy, #removes "api_v1" from the derived model scope, but it cant be blank so pick something that doesn't contain the version. 
       :path => "", #removes "users" from the path so it is just "api/:ver/login" 
       :path_names => { sign_in: 'login', sign_out: 'logout'} #changes the 'action' part of the path name, just flavour. 
    end 
    #if you need a scope, you must now include the scope you choose in devise_for :as. for example: 
    devise_scope :fancy_user do 
    #helper route so we can test with a logout link or url using GET 
    get :logout, :controller => :sessions, :action => :destroy 
    end 
end 

Questo sarà anche impostare fino a aggiungere la tua strategia di autenticazione personalizzati e suona bello, con soluzioni come l'autenticazione remota di 4TRABE http://4trabes.com/2012/10/31/remote-authentication-with-devise/ ora è possibile avere autenticato autenticazione API esterna personalizzata con versione. Ovviamente possiamo anche aggiungere un controller personalizzato, ma non è necessario escludere il numero di versione dall'ambito.

Ricorda che dal momento in cui hai cambiato l'ambito, è necessario fare riferimento in questo modo quando lo registri. vale a dire. inizializzatori/devise.rb finisce come:

config.warden do |manager| 
    manager.strategies.add(:remote_authenticatable, Devise::Strategies::RemoteAuthenticatable) 
    manager.default_strategies(:scope => :fancy_user).unshift :remote_authenticatable 
end 
config.add_module :remote_authenticatable, :controller => :sessions, :route => { :session => :routes } 

Spero che questo aiuti qualcuno, godere^_^