4

Я использую Rails-api для создания тестового приложения для проверки подлинности, которое использует Devise_token_auth gem. User.rb модель выглядитПараметр Unpermitted с использованием маркера Devem Auth в Rails API

class User < ActiveRecord::Base 
    before_save :set_auth_token 

    # Include default devise modules. 
    devise :database_authenticatable, :registerable, 
      :recoverable, :rememberable, :trackable, :validatable, 
      :confirmable, :omniauthable 
    include DeviseTokenAuth::Concerns::User 

    private 
    def set_auth_token 
    if self.authentication_token.blank? 
     self.authentication_token = generate_authentication_token 
    end 
    end 

    def generate_authentication_token 
    loop do 
     token = Devise.friendly_token 
     break token unless User.where(authentication_token: token).first 
    end 
    end 

end 

routes.rb содержит

mount_devise_token_auth_for 'User', at: 'auth' 

Также я использую по умолчанию SessionsController и RegistrationsController определенный DeviseTokenAuth драгоценный камень

Мой во внешнем интерфейсе сделанный в Ember-cli, где я сделал регистрационную форму, которая использует Ember-simple-auth-devise, Devise authorizer, чтобы вызвать/sign_in ur л рельсов апи. Тлеющей простой аутентификации упаковывает параметры, такие как

{"user"=>{"password"=>"[FILTERED]", "email"=>"[email protected]"}} 

в то время как направляющие DeviseTokenAuth ожидает, что параметры запроса, такие как

{"password"=>"[FILTERED]", "email"=>"[email protected]"} 

Ошибка произведенная

Processing by DeviseTokenAuth::RegistrationsController#create as JSON 
    Parameters: {"user"=>{"password"=>"[FILTERED]", "email"=>"[email protected]"}} 
Unpermitted parameter: user 

Проблема может быть решена, если либо Rails DeviseTokenAuth gem принимает параметры, завернутые в «пользователь» ИЛИ Ember-simple-auth отправляет параметры, развернутые, но, к сожалению, документация для них обоих явно не упоминает о том, как реализовать то же самое. Я попытался изменить ResourceName для Ember-простой-AUTH обнулить, но он не работает

ENV['simple-auth-devise'] = { 
    resourceName: null, 
    serverTokenEndpoint: 'http://localhost:3000/auth/sign_in' 
    }; 

Есть ли способ отправки распакованных параметров в Эмбер-простой аутентификации, изобрести? Или можно разрешить параметры, содержащиеся в «пользователе» для всех контроллеров, сгенерированных с использованием DeviseTokenAuth gem?

Версии используются:

devise_token_auth (0.1.36) 
    devise (~> 3.5.2) 
    rails (~> 4.2) 
"ember-simple-auth": "0.8.0" 
+0

Я думаю, что вы будете иметь, чтобы использовать уголек-простой-авторизации без DEViSE плагина и катить его самостоятельно. Похоже, что модуль разработки разработан специально для ванильного дизайна. – penner

+0

Github issue https://github.com/lynndylanhurley/devise_token_auth/issues/822 –

ответ

1

Решение состоит в том, чтобы расширить ember-simple-auth/addon/authenticators/devise.js, как это сделано here.


В app/authenticators/devise.js заменить:

import Devise from 'ember-simple-auth/authenticators/devise'; 

export default Devise.extend({}); 

по:

import Ember from 'ember'; 
import Devise from 'ember-simple-auth/authenticators/devise'; 

const { RSVP: { Promise }, isEmpty, getProperties, run, get } = Ember; 

export default Devise.extend({ 
    loginEndpoint: '/auth/sign_in', 
    logoutEndpoint: '/auth/sign_out', 

    authenticate(identification, password) { 
    return new Promise((resolve, reject) => { 
     let { identificationAttributeName } = getProperties(this, 'identificationAttributeName'); 
     let data = { password }; 
     data[identificationAttributeName] = identification; 

     let requestOptions = { url: get(this, 'loginEndpoint') }; 

     this.makeRequest(data, requestOptions).then((response) => { 
     if (response.ok) { 
      response.json().then((json) => { 
      let data = { 
       account: json, 
       accessToken: response.headers.get('access-token'), 
       expiry: response.headers.get('expiry'), 
       tokenType: response.headers.get('token-type'), 
       uid: response.headers.get('uid'), 
       client: response.headers.get('client') 
      }; 

      if (this._validate(data)) { 
       run(null, resolve, data); 
      } else { 
       run(null, reject, 'Check that server response header includes data token and valid.'); 
      } 
      }); 
     } else { 
      response.json().then((json) => run(null, reject, json)); 
     } 
     }).catch((error) => run(null, reject, error)); 
    }); 
    }, 

    invalidate(data) { 
    return new Promise((resolve, reject) => { 
     let headers = { 
     'access-token': data.accessToken, 
     'expiry': data.expiry, 
     'token-type': data.tokenType, 
     'uid': data.uid, 
     'client': data.client 
     }; 

     let requestOptions = { 
     url: get(this, 'logoutEndpoint'), 
     method: 'DELETE', 
     headers 
     }; 

     this.makeRequest({}, requestOptions).then((response) => { 
     response.json().then((json) => { 
      if (response.ok) { 
      run(null, resolve, json); 
      } else { 
      run(null, reject, json); 
      } 
     }); 
     }).catch((error) => run(null, reject, error)); 
    }); 
    }, 

    _validate(data) { 
    let now = (new Date()).getTime(); 

    return !isEmpty(data.accessToken) && !isEmpty(data.expiry) && (data.expiry * 1000 > now) && 
     !isEmpty(data.tokenType) && !isEmpty(data.uid) && !isEmpty(data.client); 
    } 
}); 
Смежные вопросы