Rails + Sorcery: добавить внешнюю аутентификацию к существующему пользователю

Я использую Sorcery для аутентификации в приложении Rails. У меня все настроено нормально, я могу добавлять пользователей по имени пользователя/паролю или через внешнюю аутентификацию (в данный момент только с помощью твиттера). Однако одна вещь, которую я не смог понять, - это как добавить аутентификацию для существующих пользователей, т.е. пользователь, созданный по имени пользователя, который может позже добавить свою учетную запись Twitter в качестве средства входа в систему.

Я попытался добавить метод во внешний модуль, чтобы включить эту функцию...

module Sorcery
    module Controller
        module Submodules
            module External
                module InstanceMethods
                    protected

                    def add_provider_to_user(provider)
                        provider_name = provider.to_sym
                        provider = Config.send(provider_name)
                        user_hash = provider.get_user_hash
                        config = user_class.sorcery_config

                        user = current_user.send(config.authentications_class.to_s.downcase.pluralize).build(config.provider_uid_attribute_name => user_hash[:uid], config.provider_attribute_name => provider)
                        user.save(:validate => false)

                        return user
                    end
                end
            end
        end
    end
end

... но это не сработало. Кажется, я не могу заставить класс Config вести себя так, как во внутренних методах, Config.send('twitter') всегда возвращает nil вместо провайдера.

В Sorcery для этого нет общедоступных методов. Кто-нибудь понял, как пропатчить эту функцию в приложении?


person Andrew    schedule 30.04.2012    source источник
comment
Просто примечание: я был бы в равной степени заинтересован в решении, которое работало бы через мой контроллер аутентификации, как и в решении, исправляющем внешний модуль волшебства. Приведенный выше пример — это просто моя попытка, основанная на некоторых запросах на исправления, которые я видел на github.   -  person Andrew    schedule 30.04.2012


Ответы (2)


Недавно я использовал https://github.com/rcarter/sorcery, чтобы добавить возможность связать поставщика с уже аутентифицированный пользователь. Это делает то, что вы ищете?

Я должен предупредить, однако, что он пытается сохранить access_token в вашей модели пользователя ... вы, вероятно, захотите удалить это. См. изменения здесь: https://github.com/rcarter/sorcery/commit/f3984749659bceb7f7438cae8ea95dba1a215>

person sdoxsee    schedule 09.05.2012

Это очень старый вопрос, но я просто хотел добавить свое решение для этого с идентификаторами Microsoft. Мне нужно было, чтобы пользователи входили в систему с помощью Microsoft SSO. Я хотел иметь возможность создавать учетные записи пользователей и настраивать их для входа в систему, используя свои учетные данные Microsoft. Я использую Ruby 2.7, rails 5.1 с Sorcery 0.15. Я использовал пример кода внешних провайдеров в вики по волшебству, чтобы начать с https://github.com/Sorcery/sorcery/wiki/External

На стороне Azure Active Directory:

  1. Добавьте свое веб-приложение в качестве зарегистрированного приложения
  2. Загрузите CSV-файл своих пользователей и используйте эту информацию для создания профилей пользователей в таблице «Пользователи». Их адрес электронной почты будет их именем пользователя.
  3. Создайте секрет клиента в Azure в своем зарегистрированном приложении.
  4. Добавьте URI веб-перенаправления для своего приложения, например http://localhost:32795/oauth/callback?provider=microsoft.

В вашем приложении:

  1. Создайте записи аутентификации пользователей в таблице Authentications. У каждого пользователя будет свой user_id из таблицы Users, его uid, который является идентификатором в загруженном CSV-файле (в Azure это идентификатор объекта), и поставщик — microsoft.
  2. Добавьте маршрут для обратных вызовов MSFT get "/oauth/callback/microsoft" => "oauths#callback" # for microsoft
  3. Настройте внешнего провайдера в

приложение/config/initializers/sorcery.rb

config.microsoft.key = <your Application(client)ID>
config.microsoft.secret = <client secret you generated in Azure>
config.microsoft.callback_url = "http://localhost:3000/oauth/callback?provider=microsoft"
config.microsoft.user_info_mapping = {:email => "userPrincipalName", :username => "userPrincipalName"}
config.microsoft.scope = "openid email https://graph.microsoft.com/User.Read"

Ваше приложение теперь будет использовать идентификатор MSFT для входа в систему. Обратите внимание, что даже если вы выйдете из своего приложения, когда вы щелкнете ссылку для входа в систему с помощью MSFT, вы автоматически войдете в систему, поскольку ваши учетные данные MSFT сохраняются в браузере. Если вы войдете в свою учетную запись MSFT и выйдете из системы, вам потребуется установить URI выхода в Azure, который сообщит вашему приложению также выйти из системы. Или вы можете настроить свое приложение так, чтобы оно избавлялось от офисных файлов cookie при выходе из системы.

person Beartech    schedule 30.08.2020