2015-02-11 63 views
0

我正嘗試在wine api rails應用程序中配置設計令牌生成。由於我有當前版本的設計,令牌生成已被禁用。我有幾個問題。首先,就是當我提交會話控制器用戶名和密碼,它給了我一個錯誤,「ensure_authentication_token」:使用設計令牌配置rails grape api

undefined method `ensure_authentication_token!' for #<User:0x007f880cca9090> 

這太奇怪了,因爲你可以看到下面,我把它定義我用戶模型,當我在rails控制檯中手動創建用戶時,它可以正常工作。

是範圍問題還是爲什麼會發生?

用戶模型:

class User < ActiveRecord::Base 
    before_save :ensure_authentication_token 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 


    def ensure_authentication_token 
    if authentication_token.blank? 
     self.authentication_token = generate_authentication_token 
    end 
    end 

    private 

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

會話葡萄API控制器:

module API 
    module V1 
    class Sessions < Grape::API 
     include API::V1::Defaults 

     resource :sessions do 

     params do 
      requires :email, type: String, desc: "Email" 
      requires :password, type: String, desc: "Password" 
     end 

     post do 
     email = params[:email] 
     password = params[:password] 

     if email.nil? or password.nil? 
      error!({error_code: 404, error_message: "Invalid Email or Password."},401) 
      return 
     end 

     user = User.where(email: email.downcase).first 
     if user.nil? 
      error!({error_code: 404, error_message: "Invalid Email or Password."},401) 
      return 
     end 

     if !user.valid_password?(password) 
      error!({error_code: 404, error_message: "Invalid Email or Password."},401) 
      return 
     else 
      user.ensure_authentication_token! 
      user.save 
      {status: 'ok', token: user.authentication_token}.to_json 
     end 
     end 
     end 
    end 
    end 
end 

的第二個問題是,當我跟隨this blog,它說,我需要添加以下驗證檢查在我的默認.rb在基本的api控制器中。當我添加「before do」部分時,即使我輸入了正確的憑證,但它甚至不會繼續訪問上面提到的其他會話控制器,也會出現拒絕訪問錯誤。

before do 
    error!("401 Unauthorized, 401") unless authenticated 
    end 

    helpers do 
    def warden 
     env['warden'] 
    end 

    def authenticated 
     return true if warden.authenticated? 
     params[:access_token] && @user = User.find_by_authentication_token(params[:access_token]) 
    end 

    def current_user 
     warden.user || @user 
    end 
    end 

感謝您給予的任何幫助!

編輯:菲利普是絕對正確的,其中一個問題是由於爆炸與非加強版的ensure_authentication_token。刪除!從控制器解決了這個問題。另一個問題的確是從我之前添加的「之前做的」循環。

這是非常接近工作,我可以在我的API中給予和接收令牌,但是當它連接到餘燼時,它抱怨缺少一個csrf令牌,即使我的「protect_from_forgery with::null_session」設置在我的application.rb

+1

您無法在所有時間阻止之前調用它,因爲它會阻止首先嚐試進行的身份驗證API調用。 – 2015-02-11 23:13:59

+1

當你定義了'ensure_authentication_token'(bang vs non bang methods)時,你是否犯了一個錯字或是抱怨'ensure_authentication_token!'? – 2015-02-11 23:52:31

回答

2

在您的用戶模型中,您可以定義一個名爲ensure_authentication_token的方法。

在您的會話控制器中,您調用一個名爲ensure_authentication_token!的方法。

這些都是不一樣的方法:Why are exclamation marks used in Ruby methods?

這是防止你產生認證令牌,這可能解釋了「401未授權401」錯誤。

+0

感謝您的迴應!所以在這種情況下,我可能會想要不爆炸/!所有情況下的版本,對吧? – Coherent 2015-02-12 05:57:12

+1

任何一個都沒問題,他們只需要保持一致。既然方法沒有爆炸,我會毫不留情地去。無論如何,你都將控制權保存在控制器的下一行,這就是爆炸對於Devise來說意味着什麼。 更多信息:http://ruby-doc.org//gems/docs/d/dcu-devise-1.0.7/Devise/Models/TokenAuthenticatable.html – 2015-02-12 14:50:46