使用设计令牌配置 rails 葡萄 api
Configuring rails grape api with devise token
我正在尝试使用 grape api rails 应用程序中的设计来配置令牌生成。由于我有当前版本的设计,令牌生成已被禁用。我有几个问题。首先,当我向会话控制器提交用户名和密码时,它给我一个错误 "ensure_authentication_token":
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
Sessions Grape 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时,它说我需要在基本api控制器中的defaults.rb中添加以下身份验证检查。当我添加 "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
感谢您的帮助!
编辑:Phillip 完全正确,其中一个问题是由于 ensure_authentication_token 的 bang 与非 banged 版本造成的。删除!从控制器解决了这个问题。另一个问题确实是我添加了 "before do" 循环。
这非常接近工作,我可以在我的 api 中提供和接收令牌,但是当它连接到 ember 时,它会抱怨缺少 csrf 令牌,即使我有 "protect_from_forgery with: :null_session" 设置在我的 application.rb
在您的用户模型中,您定义了一个名为 ensure_authentication_token
的方法。
在您的会话控制器中,您调用了一个名为 ensure_authentication_token!
的方法。
这些不是同一个方法:Why are exclamation marks used in Ruby methods?
这会阻止您生成身份验证令牌,这可能解释了“401 未授权,401”错误。
我正在尝试使用 grape api rails 应用程序中的设计来配置令牌生成。由于我有当前版本的设计,令牌生成已被禁用。我有几个问题。首先,当我向会话控制器提交用户名和密码时,它给我一个错误 "ensure_authentication_token":
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
Sessions Grape 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时,它说我需要在基本api控制器中的defaults.rb中添加以下身份验证检查。当我添加 "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
感谢您的帮助!
编辑:Phillip 完全正确,其中一个问题是由于 ensure_authentication_token 的 bang 与非 banged 版本造成的。删除!从控制器解决了这个问题。另一个问题确实是我添加了 "before do" 循环。
这非常接近工作,我可以在我的 api 中提供和接收令牌,但是当它连接到 ember 时,它会抱怨缺少 csrf 令牌,即使我有 "protect_from_forgery with: :null_session" 设置在我的 application.rb
在您的用户模型中,您定义了一个名为 ensure_authentication_token
的方法。
在您的会话控制器中,您调用了一个名为 ensure_authentication_token!
的方法。
这些不是同一个方法:Why are exclamation marks used in Ruby methods?
这会阻止您生成身份验证令牌,这可能解释了“401 未授权,401”错误。