Ich habe token_authenticatable
bereits verwendet, um meine API abzusichern. Ich habe jedoch festgestellt, dass sie veraltet war. Was soll ich stattdessen verwenden und warum haben sie es abgelehnt?
Aus ihrem Blog :
"Wir können das von TokenAuthenticatable zur Verfügung gestellte Authentifizierungs-Token nicht verdauen, da diese häufig Teil von APIs sind, bei denen das Token häufig verwendet wird. Da die Verwendung des authentifizierbaren Token zwischen Anwendungen sehr unterschiedlich sein kann und jeweils unterschiedliche Sicherheitsgarantien erfordern, haben wir uns dazu entschieden TokenAuthenticatable von Devise entfernen, damit Benutzer die beste Option auswählen können. "
Es liegt nun an den Entwicklern, je nach ihrer Verwendung des Authentifizierungstokens die beste Wahl zu treffen.
Kasse diese Gist .
Ich wollte die Rückwärtskompatibilität beibehalten, also habe ich alles in ein Anliegen gestellt, um die Warnung zu vermeiden. Hier ist mein Code und die zugehörigen Spezifikationen:
/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
Ich habe diese Frage bereits beantwortet und eine Alternative mit Beispielcode zur Verfügung gestellt, der Folgendes beinhaltet: wie man OAuth 2.0 API/Token-Authentifizierung mit Rails und Warden ausführt.
Devise ist für APIs ziemlich irrelevant und ich fühlte mich immer unwohl, wenn ich versuchte, mit Devise zu ringen, damit es so funktioniert, wie ich es brauchte, also habe ich es aufgegeben Mein Beispiel verwendet.
Ich habe die devise_token_auth gem verwendet, eine der Alternativen, die auf der Wiki-Seite Devise für die Token-Authentifizierung aufgeführt sind.
Ich weiß nicht, ob es jetzt der De-facto-Standard für Devise Token Auth ist oder nicht, aber es ist definitiv meine Wahl.
Das sieht nach einer sehr alten Frage aus, trotzdem werde ich hier eine großartige gem
für die Platte veröffentlichen.
Sie können Ihre API mit dem Doorkeeper Gem sichern, einem hervorragenden Anbieter für Rails-Apps.