Devise token_authenticatable已弃用,有什么替代方案?

时间:2013-09-21 11:20:27

标签: ruby-on-rails devise deprecated

我之前一直在使用token_authenticatable来保护我的API,但是,我发现它已被弃用了?我应该使用什么,为什么他们弃用它?

5 个答案:

答案 0 :(得分:41)

我想保持向后兼容性,所以我只是将所有内容都转移到关注点以避免警告。这是我的代码和相关规范:

/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

答案 1 :(得分:31)

来自blog

  

“我们无法消化TokenAuthenticatable提供的身份验证令牌,因为它们通常是令牌多次使用的API的一部分。由于可验证令牌的使用在应用程序之间可能有很大差异,每个都需要不同的安全保证,我们已决定从Devise中删除TokenAuthenticatable,允许用户选择最佳选项。“

现在由开发人员根据他们对身份验证令牌的使用情况来选择最合适的。

结帐gist

答案 2 :(得分:0)

我之前已回答过这个问题,并提供了一个替代方案,其示例代码涵盖how to do OAuth 2.0 API/Token authentication with Rails and Warden

对于API而言,Devise几乎无关紧要,我总是觉得与Devise搏斗以使其按照我需要的方式工作所以我放弃了它,但是Devise所基于的Warden中间件仍然有用支持多种身份验证策略,这是我的示例使用的。

答案 3 :(得分:0)

我一直在使用devise_token_auth宝石,这是Devise wiki page for token authentication中列出的替代品之一。

我不知道它现在是否是Devise token auth的事实上的标准,但它绝对是我的首选。

答案 4 :(得分:0)

这看起来像一个非常古老的问题,不过我会在这里为记录添加一个很棒的gem

您可以使用Doorkeeper Gem保护您的API,这是一个非常棒的Oails应用程序提供商。