Я использовал token_authenticatable
раньше, чтобы защитить свой API, однако я обнаружил, что он устарел? Что я должен использовать вместо этого и почему они его осуждают?
Devise token_authenticatable устарел, какова альтернатива?
Ответ 1
Из blog:
"мы не можем переваривать токен аутентификации, предоставляемый TokenAuthenticatable, поскольку они часто являются частью API, где токен используется много раз. Поскольку использование аутентифицируемого токена может значительно различаться между приложениями, каждый из которых требует различных гарантий безопасности, мы решили удалить TokenAuthenticatable из Devise, что позволяет пользователям выбирать лучший вариант."
Теперь разработчикам нужно выбрать наилучшее соответствие в зависимости от использования токена аутентификации.
Оформить заказ gist.
Ответ 2
Я хотел сохранить обратную совместимость, поэтому я просто переместил все в беспокойство, чтобы избежать предупреждения. Здесь мой код и связанные спецификации:
/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
Ответ 3
Я уже ответил на этот вопрос и предоставил альтернативу с примером кода, охватывающим как выполнить аутентификацию API/токена OAuth 2.0 с помощью Rails и Warden.
Devise практически не имеет отношения к API, и мне всегда было неудобно пытаться бороться с Devise, чтобы он работал так, как мне было нужно, поэтому я его бросил, но промежуточное ПО Warden, на котором основано Devise, по-прежнему полезно для поддержки нескольких стратегий аутентификации и это то, что использует мой пример.
Ответ 4
Я использую devise_token_auth gem, который является одним из альтернатив, перечисленных в Создать страницу вики для аутентификации токена.
Я не знаю, стал ли он теперь стандартом де-факто для аутентификации маркера Devise или нет, но это определенно мой переход.
Ответ 5
Это похоже на очень старый вопрос, тем не менее, для этой записи я поставлю потрясающий gem
.
Вы можете защитить свой API с помощью Doorkeeper Gem, потрясающего поставщика для приложений Rails.