我之前一直在使用token_authenticatable
来保护我的API,但是,我发现它已被弃用了?我应该使用什么,为什么他们弃用它?
答案 0 :(得分:41)
我想保持向后兼容性,所以我只是将所有内容都转移到关注点以避免警告。这是我的代码和相关规范:
/app/models/concerns/token_authenticatable.rb
module TokenAuthenticatable
extend ActiveSupport::Concern
module ClassMethods
def find_by_authentication_token(authentication_token = nil)
if authentication_token
where(authentication_token: authentication_token).first
end
end
end
def ensure_authentication_token
if authentication_token.blank?
self.authentication_token = generate_authentication_token
end
end
def reset_authentication_token!
self.authentication_token = generate_authentication_token
save
end
private
def generate_authentication_token
loop do
token = Devise.friendly_token
break token unless self.class.unscoped.where(authentication_token: token).first
end
end
end
/app/models/user.rb
class User < ActiveRecord::Base
include TokenAuthenticatable
end
/app/models/employee.rb
class Employee < ActiveRecord::Base
include TokenAuthenticatable
end
/spec/models/user_spec.rb
describe User do
it_behaves_like 'token_authenticatable'
end
/spec/models/employee_spec.rb
describe Employee do
it_behaves_like 'token_authenticatable'
end
规格/ shared_examples / token_authenticatable.rb
shared_examples 'token_authenticatable' do
describe '.find_by_authentication_token' do
context 'valid token' do
it 'finds correct user' do
class_symbol = described_class.name.underscore
item = create(class_symbol, :authentication_token)
create(class_symbol, :authentication_token)
item_found = described_class.find_by_authentication_token(
item.authentication_token
)
expect(item_found).to eq item
end
end
context 'nil token' do
it 'returns nil' do
class_symbol = described_class.name.underscore
create(class_symbol)
item_found = described_class.find_by_authentication_token(nil)
expect(item_found).to be_nil
end
end
end
describe '#ensure_authentication_token' do
it 'creates auth token' do
class_symbol = described_class.name.underscore
item = create(class_symbol, authentication_token: '')
item.ensure_authentication_token
expect(item.authentication_token).not_to be_blank
end
end
describe '#reset_authentication_token!' do
it 'resets auth token' do
end
end
end
答案 1 :(得分:31)
来自blog:
“我们无法消化TokenAuthenticatable提供的身份验证令牌,因为它们通常是令牌多次使用的API的一部分。由于可验证令牌的使用在应用程序之间可能有很大差异,每个都需要不同的安全保证,我们已决定从Devise中删除TokenAuthenticatable,允许用户选择最佳选项。“
现在由开发人员根据他们对身份验证令牌的使用情况来选择最合适的。
结帐gist。
答案 2 :(得分:0)
我之前已回答过这个问题,并提供了一个替代方案,其示例代码涵盖how to do OAuth 2.0 API/Token authentication with Rails and Warden。
对于API而言,Devise几乎无关紧要,我总是觉得与Devise搏斗以使其按照我需要的方式工作所以我放弃了它,但是Devise所基于的Warden中间件仍然有用支持多种身份验证策略,这是我的示例使用的。答案 3 :(得分:0)
我一直在使用devise_token_auth宝石,这是Devise wiki page for token authentication中列出的替代品之一。
我不知道它现在是否是Devise token auth的事实上的标准,但它绝对是我的首选。
答案 4 :(得分:0)
这看起来像一个非常古老的问题,不过我会在这里为记录添加一个很棒的gem
。
您可以使用Doorkeeper Gem保护您的API,这是一个非常棒的Oails应用程序提供商。