web-dev-qa-db-ja.com

非推奨のtoken_authenticatableを考案しますが、代替手段は何ですか?

以前にtoken_authenticatableを使用してAPIを保護していましたが、廃止されたことがわかりました。代わりに何を使用する必要があり、なぜ彼らはそれを廃止したのですか?

36
harinsa

彼らの blog から:

「TokenAuthenticatableによって提供される認証トークンは、多くの場合トークンが何度も使用されるAPIの一部であるため、ダイジェストできません。 DeviseからTokenAuthenticatableを削除して、ユーザーが最適なオプションを選択できるようにします。」

認証トークンの使用法に応じて最適なものを選択するのは、開発者次第です。

これを確認してください Gist

31
Jef

下位互換性を維持したかったので、警告を回避するためにすべてを懸念事項に移動しました。コードと関連する仕様は次のとおりです。

/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

以前にこの質問に回答し、 OAuthとWarden)を使用したRails 2.0 API/Token認証の方法

DeviseはAPIにはほとんど無関係であり、Deviseを使って必要な方法で動作させようとするのはいつも不快でしたが、Deviseが基づいているWardenミドルウェアはまだ複数の認証戦略をサポートするのに役立ちます私の例では使用しています。

0
Andrew Hacking

devise_token_auth gemを使用しました。これは トークン認証用のWikiウィキページ にリストされている代替手段の1つです。

現在、それがDeviseトークン認証の事実上の標準であるかどうかはわかりませんが、間違いなく私の目標です。

0
Jason Swett

これは非常に古い質問のように見えますが、それでもここでレコードに素晴らしいgemを付けます。

APIを保護するには、 Doorkeeper Gem 、素晴らしいoauth Railsアプリのプロバイダー。

0
Sagar Ranglani