Подтвердить что ты не робот

Devise token_authenticatable устарел, какова альтернатива?

Я использовал token_authenticatable раньше, чтобы защитить свой API, однако я обнаружил, что он устарел? Что я должен использовать вместо этого и почему они его осуждают?

4b9b3361

Ответ 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, по-прежнему полезно для поддержки нескольких стратегий аутентификации и это то, что использует мой пример.

Ответ 5

Это похоже на очень старый вопрос, тем не менее, для этой записи я поставлю потрясающий gem.

Вы можете защитить свой API с помощью Doorkeeper Gem, потрясающего поставщика для приложений Rails.