web-dev-qa-db-fra.com

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

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

36
harinsa

De leur blog

"nous ne pouvons pas digérer le jeton d'authentification fourni par TokenAuthenticatable, car ils font souvent partie d'API où le jeton est utilisé plusieurs fois. L'utilisation du jeton authentifiable pouvant varier considérablement entre les applications, chacune nécessitant des garanties de sécurité différentes, nous avons décidé de supprimer TokenAuthenticatable de Devise, permettant aux utilisateurs de choisir la meilleure option. "

Il appartient maintenant aux développeurs de choisir le meilleur ajustement en fonction de l'utilisation du jeton d'authentification.

Commander ceci Gist .

31
Jef

Je voulais garder la compatibilité avec les versions antérieures, alors je viens de tout déplacer dans un souci d'éviter l'avertissement. Voici mon code et les spécifications associées:

/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

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
41
Neal

J'ai déjà répondu à cette question et fourni une alternative avec un exemple de code couvrant comment faire l'authentification Token/OAuth 2.0 API avec Rails et Warden .

Devise est à peu près inutile pour les API et je me suis toujours senti mal à l'aise d'essayer de le faire fonctionner de la manière dont j'avais besoin, alors je l'ai abandonné, mais le middleware Warden sur lequel il repose est toujours utile mon exemple utilise.

0
Andrew Hacking

J'utilise la gemme devise_token_auth qui est l'une des alternatives répertoriées dans la page wiki Devise pour l'authentification par jeton .

Je ne sais pas si c'est maintenant le standard de facto pour l'authentification de jeton Devise ou pas, mais c'est définitivement mon préféré.

0
Jason Swett

Cela ressemble à une très vieille question, néanmoins je vais mettre une gem géniale pour l'enregistrement ici.

Vous pouvez sécuriser votre API avec Doorkeeper Gem , un formidable fournisseur d'authentification pour les applications Rails.

0
Sagar Ranglani