我正嘗試在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
您無法在所有時間阻止之前調用它,因爲它會阻止首先嚐試進行的身份驗證API調用。 – 2015-02-11 23:13:59
當你定義了'ensure_authentication_token'(bang vs non bang methods)時,你是否犯了一個錯字或是抱怨'ensure_authentication_token!'? – 2015-02-11 23:52:31