我以前一直在使用token_authenticatable
來保護我的API,但是,我發現它已被棄用?我應該使用什麼,爲什麼他們不贊成?設計token_authenticatable不推薦使用,有什麼選擇?
回答
我想保持向下兼容性,所以我只是將所有事情都轉移到了關注點以避免警告。這裏是我的代碼和相關規格:
/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
/應用/型號/員工。 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 - 不錯,但我認爲你應該在'generate_authentication_token'中用'self.class.unscoped'代替'User',這樣Concern就不會綁定到特定的'User'類。 –
你能解釋一下爲什麼我們需要做'reset_authentication_token!'嗎? –
即使在實現這個之後,你仍然需要通過你自己的 – Lucio
我以前回答了這個問題,並設置有例如代碼覆蓋how to do OAuth 2.0 API/Token authentication with Rails and Warden的替代方案。對於API來說,Devise幾乎是毫不相關的,我總是覺得不適合與Devise搏鬥,讓它按照我需要的方式工作,所以我放棄了它,但Devise所依賴的Warden中間件仍然支持多重身份驗證戰略,是我的例子使用。
我一直在使用devise_token_auth寶石,這是Devise wiki page for token authentication中列出的替代品之一。
我不知道它現在是否是Devise token auth的事實標準,但它絕對是我的選擇。
這看起來像一個非常古老的問題,但我會把一個很棒的gem
記錄在這裏。
您可以使用Doorkeeper Gem保護您的API,這是一個非常棒的Rails應用程序oauth提供程序。
- 1. 爲什麼$ .browser不推薦使用 - 什麼是更好的選擇?
- 2. 爲什麼Logger.isInfoEnabled不推薦使用org.jboss.logging.Logger?
- 3. 爲什麼不推薦使用isJavaLetterOrDigit?
- 4. 爲什麼不推薦使用JButton.enable?
- 5. 爲什麼不推薦使用struts2 FilterDispatcher?
- 6. 爲什麼SET不推薦使用?
- 7. 爲什麼不推薦使用StringTokenizer?
- 8. std :: iterator爲什麼不推薦使用?
- 9. Object.observe()爲什麼不推薦使用
- 10. jQuery切換不推薦使用什麼?
- 11. 爲什麼不推薦使用std :: strstream?
- 12. 爲什麼不推薦使用body.scrollTop?
- 13. 爲什麼不推薦使用window.showModalDialog?代替使用什麼?
- 14. 爲什麼不推薦使用assert_template,而應該使用什麼?
- 15. 爲什麼不推薦HibernateTemplate?
- 16. 使用ASP.NET MVC3推薦的API設計
- 17. 設計模式推薦過濾選項
- 18. 設計上沒有會話路線:token_authenticatable
- 19. PHP對不推薦使用的函數有什麼作用?
- 20. 推薦設計模式
- 21. 推薦的C++庫設計
- 22. 推薦系統設計
- 23. 桂設計模式推薦
- 24. 你會推薦什麼網格設置
- 25. 什麼是推薦的gitattributes設置?
- 26. 什麼時候推薦使用MySQL BLOB?
- 27. 這個問題會推薦什麼設計模式?
- 28. 你會推薦什麼樣的免費網頁設計軟件?
- 29. 從API 17開始,Android WebView中不推薦使用私有瀏覽。有什麼選擇?
- 30. 如果不推薦使用window.navigator.userAgent,應該使用什麼?
如果您想要針對特定圖書館的建議,我對[devise_token_auth](https://github.com/lynndylanhurley/devise_token_auth)感到滿意。 –