Миграция от устройства к всеведущему (идентичность) - PullRequest
2 голосов
/ 08 февраля 2012

Я подумываю о переходе на Omniauth 1.0 (используя стратегию «идентичности» или гем) из Devise 1.4.7, у меня вопрос после выполнения всего преобразования кода, просмотра и т. Д., Будут ли старые пароли, эти учетные записи пользователейсозданный с помощью Devise, все еще работающий с теми же паролями в OmniAuth?

Я провел некоторое исследование, и оба используют bcrypt, поэтому я предполагаю, что "да" они будут работать как прежде, а пользователи не будут иметьсоздавать новые пароли.Или я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 30 мая 2012

Разработка паролей не напрямую , совместимых с omniauth-identity

Это правда, что они оба используют bcrypt для хеширования пароля, однако Devise добавляет «перец» к паролю. Вы должны добавить код к omniauth-identity, чтобы поддерживать «перец».

Перец ваши пароли

Devise добавляет перец к вашим паролям (так как он уже солен bcrypt), поэтому для того, чтобы вы перешли от устройства пользователей к omniauth-identity, вы должны научить стратегию идентификации, как обрабатывать пароли. Этот фрагмент кода работает для нас, однако мы не изменили параметр конфигурации: stretches в devise.

# snatch the pepper setting from the devise initializer
pepper = "biglonguglystringfromyourdeviseinitializer"

# password created by devise in your db (i.e. "my_password_123")
encrypted_password = "$2a$10$iU.Br8ZClxuqldJt8Evl5OaBbHPJeBWbGV/1RoUsaNIZMBo8wHYTq" 

# pepper the password then compare it using BCrypt like identity does
BCrypt::Password.new(encrypted_password) == "my_password_123#{pepper}"
 => true

Как мы это сделали

Это очень быстрый и грязный патч обезьяны, который мы использовали, чтобы он работал. Мы исследуем, как добавить эту функцию более подходящим способом.

# file: ~/railsapp/config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :identity
end


module OmniAuth
  module Identity
    module SecurePassword
      module InstanceMethodsOnActivation
        # Returns self if the password is correct, otherwise false.
        def authenticate(unencrypted_password)
          pepper = "the big pepper string from the devise initializer"
          if BCrypt::Password.new(password_digest) == "#{unencrypted_password}#{pepper}"
            self
          else
            false
          end
        end

        # Encrypts the password into the password_digest attribute.
        def password=(unencrypted_password)
          pepper = "the big pepper string from the devise initializer"
          @password = unencrypted_password
          unless unencrypted_password.empty?
            self.password_digest = BCrypt::Password.create("#{unencrypted_password}#{pepper}")
          end
        end
      end
    end
  end
end
0 голосов
/ 08 февраля 2012

Я не думаю, что вы упускаете что-то решающее вообще.Оба используют bcrypt.Потрясающие. Но имеет ли это значение? Думаю, это действительно так.

Devise завершает процесс аутентификации по отношению к модели, то есть, скажем, users в этом случае.

Теперь ваши старые пользователи уже зарегистрированы и подтверждены, так что это действительно не проблема.encrypted_password и hashed_password все еще находятся в таблице пользователей для доступа пользователей.

О чем вам следует беспокоиться?

=> Возможно, вам придется беспокоиться о фильтре authenticate_user!.Я предполагаю, так как они оба используют bcrypt, аутентификация не будет проблемой.Возможно, если OmniAuth нет, то способ аутентификации пользователей будет совершенно другим, и ваш код развалится.

Это то, что я должен заботиться, это то, что я чувствую.

...