以前にtoken_authenticatable
を使用してAPIを保護していましたが、廃止されたことがわかりました。代わりに何を使用する必要があり、なぜ彼らはそれを廃止したのですか?
下位互換性を維持したかったので、警告を回避するためにすべてを懸念事項に移動しました。コードと関連する仕様は次のとおりです。
/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
以前にこの質問に回答し、 OAuthとWarden)を使用したRails 2.0 API/Token認証の方法 。
DeviseはAPIにはほとんど無関係であり、Deviseを使って必要な方法で動作させようとするのはいつも不快でしたが、Deviseが基づいているWardenミドルウェアはまだ複数の認証戦略をサポートするのに役立ちます私の例では使用しています。
devise_token_auth gemを使用しました。これは トークン認証用のWikiウィキページ にリストされている代替手段の1つです。
現在、それがDeviseトークン認証の事実上の標準であるかどうかはわかりませんが、間違いなく私の目標です。
これは非常に古い質問のように見えますが、それでもここでレコードに素晴らしいgem
を付けます。
APIを保護するには、 Doorkeeper Gem 、素晴らしいoauth Railsアプリのプロバイダー。