2017-09-18 1 views
1

Derzeit arbeite ich an Beispiel-Web-Anwendung. In dieser Anwendung kann sich der Benutzer sowohl über die JSON-API als auch über den Browser anmelden.Erlaube Benutzerregistrierung über API und von Website-Rails 5

Für JSON API-Authentifizierung habe ich gem devise_token_authhttps://github.com/lynndylanhurley/devise_token_auth verwendet und es funktioniert gut. Ich kann mich über die API anmelden.

Aber jetzt muss ich Anmeldungsfunktionalität vom Webbrowser zur Verfügung stellen.
(URL: http://localhost:3000/auth/sign_up) immer folgende Fehler

The action 'new' could not be found for DeviseTokenAuth::RegistrationsController 

Wie kann ich aus dem Web-Browser erlauben anmelden.

Hier sind meine routes.rb Datei

Rails.application.routes.draw do 
    mount_devise_token_auth_for 'User', at: 'auth' 
end 

generierten Routen

    Prefix Verb  URI Pattern       Controller#Action 
     new_user_session GET  /auth/sign_in(.:format)    devise_token_auth/sessions#new 
      user_session POST  /auth/sign_in(.:format)    devise_token_auth/sessions#create 
    destroy_user_session DELETE /auth/sign_out(.:format)    devise_token_auth/sessions#destroy 
     new_user_password GET  /auth/password/new(.:format)   devise_token_auth/passwords#new 
     edit_user_password GET  /auth/password/edit(.:format)   devise_token_auth/passwords#edit 
      user_password PATCH /auth/password(.:format)    devise_token_auth/passwords#update 
         PUT  /auth/password(.:format)    devise_token_auth/passwords#update 
         POST  /auth/password(.:format)    devise_token_auth/passwords#create 
cancel_user_registration GET  /auth/cancel(.:format)     devise_token_auth/registrations#cancel 
    new_user_registration GET  /auth/sign_up(.:format)    devise_token_auth/registrations#new 
    edit_user_registration GET  /auth/edit(.:format)     devise_token_auth/registrations#edit 
     user_registration PATCH /auth(.:format)      devise_token_auth/registrations#update 
         PUT  /auth(.:format)      devise_token_auth/registrations#update 
         DELETE /auth(.:format)      devise_token_auth/registrations#destroy 
         POST  /auth(.:format)      devise_token_auth/registrations#create 
    auth_validate_token GET  /auth/validate_token(.:format)   devise_token_auth/token_validations#validate_token 
      auth_failure GET  /auth/failure(.:format)    devise_token_auth/omniauth_callbacks#omniauth_failure 
         GET  /auth/:provider/callback(.:format)  devise_token_auth/omniauth_callbacks#omniauth_success 
         GET|POST /omniauth/:provider/callback(.:format) devise_token_auth/omniauth_callbacks#redirect_callbacks 
     omniauth_failure GET|POST /omniauth/failure(.:format)   devise_token_auth/omniauth_callbacks#omniauth_failure 
         GET  /auth/:provider(.:format)    redirect(301) 

Muß ich hier separate devise hinzuzufügen. Bitte lass mich deine Gedanken wissen.

Antwort

2

besten Weg, dies zu einem Umfang normale devise Routen zu montieren zu erreichen sein wird verwendet werden, und API devise_token_auth Routen Rahmen zu trennen.

Rails.application.routes.draw do 

    # standard devise routes at /users 
    devise_for :users 

    # token auth routes available at /api/auth/ 
    namespace :api, defaults: { format: :json } do 
    scope module: :v1 do 
     mount_devise_token_auth_for 'User', at: 'auth' 
    end 
    end 
end 
0
new_user_registration GET  /auth/sign_up(.:format)    devise_token_auth/registrations#new 

, die zu nichts führen, weil in den GEM Controller devise_token_auth/registrations_controller es keine neue Aktion.

1 - ändern Sie das Routing, so dass die http GET Anfrage wurzelt auf Ihre controller#new Aktion.

2 - erstellen die Controller # neue Aktion

3 - haben die Form in new.html.erb rufen Sie die folgende Aktion

POST  /auth(.:format)      devise_token_auth/registrations#create 

4 - Um einen Benutzer zu erstellen, müssen Sie nur eine HTTP POST machen Anfrage an folgende URL

POST  /auth(.:format)      devise_token_auth/registrations#create 

mit den Parametern, die Sie an th übergeben müssen ist Controller-Aktion

def create 
    @resource   = resource_class.new(sign_up_params) 
    @resource.provider = "email" 

    # honor devise configuration for case_insensitive_keys 
    if resource_class.case_insensitive_keys.include?(:email) 
    @resource.email = sign_up_params[:email].try :downcase 
    else 
    @resource.email = sign_up_params[:email] 
    end 

    # give redirect value from params priority 
    @redirect_url = params[:confirm_success_url] 

    # fall back to default value if provided 
    @redirect_url ||= DeviseTokenAuth.default_confirm_success_url 

    # success redirect url is required 
    if resource_class.devise_modules.include?(:confirmable) && [email protected]_url 
    return render_create_error_missing_confirm_success_url 
    end 

    # if whitelist is set, validate redirect_url against whitelist 
    if DeviseTokenAuth.redirect_whitelist 
    unless DeviseTokenAuth::Url.whitelisted?(@redirect_url) 
     return render_create_error_redirect_url_not_allowed 
    end 
    end 

    begin 
    # override email confirmation, must be sent manually from ctrl 
    resource_class.set_callback("create", :after, :send_on_create_confirmation_instructions) 
    resource_class.skip_callback("create", :after, :send_on_create_confirmation_instructions) 
    if @resource.save 
     yield @resource if block_given? 

     unless @resource.confirmed? 
     # user will require email authentication 
     @resource.send_confirmation_instructions({ 
      client_config: params[:config_name], 
      redirect_url: @redirect_url 
     }) 

     else 
     # email auth has been bypassed, authenticate user 
     @client_id = SecureRandom.urlsafe_base64(nil, false) 
     @token  = SecureRandom.urlsafe_base64(nil, false) 

     @resource.tokens[@client_id] = { 
      token: BCrypt::Password.create(@token), 
      expiry: (Time.now + DeviseTokenAuth.token_lifespan).to_i 
     } 

     @resource.save! 

     update_auth_header 
     end 
     render_create_success 
    else 
     clean_up_passwords @resource 
     render_create_error 
    end 
    rescue ActiveRecord::RecordNotUnique 
    clean_up_passwords @resource 
    render_create_error_email_already_exists 
    end 
end 

Auf diese Weise wird der Benutzer erstellt, aber es ist kein guter Ansatz. Sie verwenden ein api wenn Sie sollten nur devise

Verwandte Themen