36 votes

Devise token_authenticatable obsolète, quelle est l'alternative?

J'utilisais token_authenticatable auparavant pour sécuriser mon API. Cependant, j'ai constaté qu'elle était obsolète? Que devrais-je utiliser à la place et pourquoi l'ont-ils déconseillé?

41voto

Neal Points 1594

Je voulais garder la compatibilité ascendante alors j'ai juste déplacé le tout dans un souci d'éviter l'avertissement. Voici mon code et associés spécifications:

/app/models/préoccupations/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/modelsemployee.rb

class Employee < ActiveRecord::Base
    include TokenAuthenticatable
end

/spec/modèles/user_spec.rb

describe User do
    it_behaves_like 'token_authenticatable'
end

/spec/modèles/employee_spec.rb

describe Employee do
    it_behaves_like 'token_authenticatable'
end

spec/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

31voto

Jef Points 3486

À partir de leur blog :

"nous ne pouvons pas digérer le jeton d'authentification fourni par TokenAuthenticatable, comme ils font souvent partie de l'Api où le jeton est utilisé à de nombreuses reprises. Depuis l'utilisation de la authenticatable jeton peut varier considérablement entre les applications, chacune nécessitant des différentes garanties de sécurité, nous avons décidé de retirer TokenAuthenticatable de Concevoir, permettant aux utilisateurs de choisir la meilleure option."

C'est maintenant aux développeurs de choisir le meilleur ajustement en fonction de leur utilisation du jeton d'authentification.

Caisse de gist.

0voto

Andrew Hacking Points 2348

J'ai répondu à cette question auparavant et a fourni une alternative avec des exemples de code couvrant comment faire OAuth 2.0 API/Jeton d'authentification avec des Rails et le Préfet.

Concevoir est assez hors de propos pour l'API et je me sentais toujours mal à l'aise en essayant de se débattre avec les Concevoir pour le faire fonctionner de la façon dont j'avais besoin, donc j'ai abandonné, mais le Gardien du middleware qui Conçoivent est toujours utile pour la prise en charge de plusieurs stratégies d'authentification et est ce que mon exemple utilise.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X