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é?
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 .
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
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.
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é.
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.