2015-03-09 17 views
8

Mam aplikację Rails 4.1 działającą z Devise do uwierzytelniania.Rails Devise and devise_token_auth. Nie działa obok

Aby uzyskać dostęp za pośrednictwem aplikacji mobilnych, chciałbym zaimplementować token auth za pomocą zalecanego gem devise_token_auth. Nie używam Omniauth

Funkcjonalności istniejącej aplikacji nie należy zmieniać.

co zrobiłem:

devise_token_auth zainstalowana poprzez gemfile.

używany generator: Szyny g devise_token_auth: zainstalować uwierzytelniania użytkownika

zmienił migracji, aby dodać wymagane pola. Migracja nie powiodła się z powodu braku Omniauth. Więc też go zainstalowałem.

Zmieniono routes.rb

devise_for :users, :skip => [:sessions, :registrations, :omniauth_callbacks] 
    as :user do 
    get 'register' => 'users/registrations#new', :as => :new_user_registration 
    post 'register' => 'users/registrations#create', :as => :user_registration 
    get 'sign_in' => 'devise/sessions#new', :as => :new_user_session 
    post 'sign_in' => 'devise/sessions#create', :as => :user_session 
    delete '/' => 'users/sessions#destroy', :as => :destroy_user_session 
    end 

dodania:

namespace :api do 
scope :v1 do 
    mount_devise_token_auth_for 'User', at: 'auth', skip: [:omniauth_callbacks] 
end 

koniec

W modelu użytkownika mam:

devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, 
    :confirmable, :timeoutable, :lockable 
include DeviseTokenAuth::Concerns::User 

Teraz, gdy próbuję sign_up nowa użytkownik daje mi va Błąd lidation:

Uid nie może być puste

Czy ktoś miał ten sam problem i rozwiązać go?

To, co dziwne, to to, że musi być zainstalowany Omniauth.

Aktualizacja:

ja zastąpić kontroler rejestracja Devise tworzyć działania:

build_resource(sign_up_params) 
resource.uid = resource.email 
resource.provider = '' 

Teraz kiedy sign_in uzyskać:

{ "błędów": [ "tylko użytkownicy autoryzowany."] }

w przeglądarce.

+0

której wersji klejnotu używasz? Próbuję zrobić to samo, ale pojawia się błąd. –

+0

obecnie: devise_token_auth 0.1.32.beta2 – yaster

+0

Powiedziałeś "Zmieniono migrację, aby dodać wymagane pola." Co to było? Czy byłeś przewodnikiem, którego śledziłeś? Próbuję dodać devise_token_auth do mojej istniejącej, spersonalizowanej implementacji Devise. –

Odpowiedz

0

Cóż, ja obecnie walczę z tym samym. Próbuję dodać devise_token_auth do Devise i nie działa to dla mnie tak daleko.

Jeśli chodzi o to, czy mówisz o "sign_up" dla Devise, czy devise_token_auth? Jeśli chodzi o program Devise, ustawienie opcji uid=email przed utworzeniem rekordu rozwiązałoby to.

+0

Potrzebuję obu. Zarejestruj się przez Devise i devise_token_auth – yaster

4

Dodanie następujących do app/modeli/user.rb:

before_validation do 
    self.uid = email if uid.blank? 
end 

zrobił to dla mnie. Upewnij się także, że dostawca jest ustawiony na "e-mail" dla "dostawcy".

0

Ten błąd jest wywoływany przez devise_token_auth, a nie przez devise.Zasadniczo devise_token_auth próbuje uwierzytelnić swoje normalne trasy devise w taki sam sposób, w jaki normalnie uwierzytelniłby żądanie API. Twoje normalne trasy opracować metody uwierzytelniania poprzez sesję, a nie za pomocą tokena, więc dostaniesz ten błąd:

{"errors":["Authorized users only."]} 

Istnieje kilka rzeczy, które mogłyby być tutaj dzieje. Najpierw upewnij się, że szukasz sprawdzania tokenów tylko w działaniach kontrolerów API. Dlatego upewnij się, że ta linia jest zawarta w twoim kontrolerze BaseAPIController, a nie w kontrolerze aplikacji.

include DeviseTokenAuth::Concerns::SetUserByToken 

Inną możliwością jest występowanie problemów związanych z położeniem nazw w twoich routes.rb. Upewnij się, że masz coś takiego. Najpierw musisz mieć devise_for, a token_auth poprawnie przesłać nazwy lub spowoduje to problemy z weryfikacją na twoich innych trasach.

Rails.application.routes.draw do 

    devise_for :admins 

    namespace :api do 
    scope :v1 do 
     mount_devise_token_auth_for 'user', at: 'auth' 
    end 
    end 
end 

Powodzenia!

Powiązane problemy