Przenoszę projekt z Rails 3 do 3.1. Mój system uwierzytelniania został łatwo przełączony na nowe has_secure_hasword w ActiveRecord. Jedynym problemem, z którym się borykam jest to, że używam OmniAuth i mam system skonfigurowany, więc jeśli użytkownik zarejestruje się za pomocą jednego z dostawców OmniAuth, konto nie powinno wymagać hasła. Nie mogę przesłonić konfiguracji sprawdzania poprawności password_digest has_secure_password. Czy mimo to wyłączyć te sprawdzenia i napisać własne, czy też będę musiał używać moich starych ręcznie pisanych funkcji bcrypt z mojej wersji witryny Rails 3?Otrzymywanie has_secure_ps Railsów do pracy z OmniAuth
Odpowiedz
Skończyło się na używaniu niestandardowych metod. Jednak później zdałem sobie sprawę, że powinienem był móc użyć wywołania zwrotnego before_validation, aby sprawdzić warunki, a następnie, jeśli pasują, ustaw password_digest na coś prostego jak "0". W ten sposób podsumowanie nigdy nie będzie puste, ale jednocześnie nie powinno nigdy być sprawdzane jako poprawne hasło, co powoduje, że logują się za pośrednictwem OmniAuth.
Możesz mnie poprawić, jeśli się mylę.
Scott, twój pomysł jest poprawny. Zmagałem się z tym problemem bezskutecznie. Próbowałem zastąpić "has_secure_password" i po prostu nie zadziała. Nie ważne gdzie utknąłem kod.
Zamiast mam następujące:
class User < ActiveRecord::Base
has_secure_password
validates_presence_of :password, :on => :create, :if => :password_required
# Associations
has_many :authentications
# Callbacks
before_validation :no_password_omniauth
# Gets set to true if the caller is trying to authenticate with omniauth.
@called_omniauth = false
# Build new omniauth users
def apply_omniauth(omniauth)
authentications.build(
:provider => omniauth['provider'],
:uid => omniauth['uid'])
self.first_name = omniauth['user_info']['first_name'] if self.first_name.blank?
self.last_name = omniauth['user_info']['last_name'] if self.last_name.blank?
self.email = omniauth['user_info']['email'] if omniauth['user_info']['email'] && self.email.blank?
@called_omniauth = true
end
def password_required
return false if @called_omniauth == true
(authentications.empty? || !password.blank?)
end
private
def no_password_omniauth
self.password_digest = 0 unless password_required
end
end
Sposób apply_omniauth jest wywoływana z kontrolera, gdy ktoś próbuje uwierzytelnić lub zarejestrować się.
Dzięki za pomysł, który przytrzasnąłeś.
Zmieniłem odpowiedź na twoją, ponieważ podałeś przykład kodu. Dzięki. Zakładam więc, że nie pozwoliłoby ci zalogować się na to konto przy użyciu jakiegokolwiek hasła? –
Co dokładnie używasz '@ named_omniauth'? Czy po prostu nie użyłoby 'authentications.empty? || ! password.blank? 'w twojej metodzie' password_required' wystarczy? –
named_omniauth to jedyny sposób, w jaki aplikacja wie, że użytkownik loguje się przez omniauth (metoda apply_omniauth). – chourobin
- 1. Konfigurowanie tras podczas pracy przy użyciu tylko omniauth do uwierzytelniania
- 2. oddzwaniania odmówiono z OmniAuth
- 3. Zadzwoń do Facebooka omniauth i #_
- 4. Serwer dostępu do railsów z innego komputera
- 5. Praca (omniauth-facebook) i (omniauth-twitter)
- 6. Jak możemy przyspieszyć otrzymywanie wiadomości z MSMQ?
- 7. OmniAuth do wyodrębniania danych z pełnego profilu z LinkedIn
- 8. Parametry Railsów z GET/POST
- 9. Wiele wersji Railsów z rbenv
- 10. Żądanie Railsów z nagłówkiem HTTP_ACCEPT `: */*`
- 11. Dodawanie omniauth-gem do omnibusowej instalacji GitLab
- 12. Przepływ pracy do pracy na widelcu github z biblioteki Pythona?
- 13. Strategia uwierzytelniania Railsów dla noob
- 14. Znajdź załadowanych dostawców dla OmniAuth
- 15. OmniAuth + Tożsamość Zapomniałem hasła
- 16. Przycisk anulowania Omniauth-facebook
- 17. omniauth do uwierzytelniania szyn i ios
- 18. Używanie omniauth do facebooka Łączenie istniejącego użytkownika z różnymi uprawnieniami
- 19. OmniAuth before_filter wymagający logowania
- 20. Otrzymywanie "nielegalnego dostępu do ładowania kolekcji" błąd
- 21. Problem z testowaniem urządzenia Omniauth Rspec
- 22. Otrzymywanie ostrzeżenia dla UIPopoverBackgroundVisualEffectView
- 23. Otrzymywanie liczby znaków EditText
- 24. Potwierdzenie pomijania pominięcia podczas korzystania z omniauth
- 25. Otrzymywanie ostrzeżenia z wyprzedzeniem przed pełnym GC
- 26. Devise + Omniauth, wersjonowanie tras
- 27. Testowanie Devise + Omniauth (Facebook) z ogórkiem
- 28. Otrzymywanie pojedynczych plików Github
- 29. Zasoby Railsów - zachowaj komentarze do licencji
- 30. Otrzymywanie błędu sed
Mam zamiar spróbować twojej metody, daj mi znać, jeśli znajdziesz lepszy sposób. –
To wydaje się łatwiejsze. Właśnie ustawiłem 'user.password_digest = SecureRandom.urlsafe_base64' w mojej metodzie' from_omniauth'. (Mimo, że po ponownym przeczytaniu odpowiedzi, domyślam się, że nie musi być randomizowana, ponieważ nie jest używana do uwierzytelniania?). Biorąc pod uwagę, że jest to o wiele szybsze - zastanawiam się, jakie jest uzasadnienie wyboru zaakceptowanej odpowiedzi? – umezo
Masz rację. Poszedłem dalej i zmieniłem odpowiedź. Chociaż nadal zdecydowałem się na bezpośrednie używanie BCrypt i pisanie własnych metod hashowania hasłem. To zbyt łatwe do zrobienia i sprawia, że twoje intencje są bardziej przejrzyste. –