2

我在 Rails 应用程序中使用 Sorcery 进行身份验证。我已经设置好了,我可以通过用户名/密码或外部身份验证添加用户(目前仅使用 twitter)。但是,我无法弄清楚的一件事是如何向现有用户添加身份验证,即。由用户名创建的用户,该用户可能希望稍后添加其 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 中没有公开的方法。有没有人想出如何将此功能修补到应用程序中?

4

2 回答 2

0

我最近使用https://github.com/rcarter/sorcery添加了将提供者链接到已通过身份验证的用户的功能。这是否符合您的要求?

我应该警告它尝试将 access_token 存储在您的用户模型中......您可能想要删除它。在此处查看更改:https ://github.com/rcarter/sorcery/commit/f3984749659bceb7f7438cae8ea95ba5a415d1e2

于 2012-05-09T20:52:25.520 回答
0

这是一个非常古老的问题,但我只是想添加我的解决方案来使用 Microsoft ID 执行此操作。我需要让用户使用 Microsoft SSO 登录。我希望能够创建用户帐户并让他们设置为使用他们的 Microsoft 凭据登录。我正在使用 Ruby 2.7、rails 5.1 和 Sorcery 0.15。我使用了魔法 wiki 中的外部提供者示例代码以https://github.com/Sorcery/sorcery/wiki/External

在 Azure Active Directory 端:

  1. 将您的 Web 应用程序添加为已注册的应用程序
  2. 下载您的用户的 .csv 文件并使用该信息在您的用户表中创建您的用户配置文件。他们的电子邮件将是他们的用户名。
  3. 在 Azure 中注册的应用下创建客户端密码。
  4. 为您的应用添加 Web 重定向 URI,例如http://localhost:32795/oauth/callback?provider=microsoft

在您的应用中:

  1. 在 Authentications 表中创建用户的身份验证条目。每个用户都将拥有来自用户表的 user_id,他们的 uid 是下载的 .csv 文件中的“id”(在 Azure 中,这是他们的对象 ID),提供者是microsoft.
  2. 为 MSFT 回调添加路由get "/oauth/callback/microsoft" => "oauths#callback" # for microsoft
  3. 在中设置外部提供程序

app/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 ID 进行登录。请注意,即使您在应用程序中注销,当您单击链接以使用 MSFT 登录时,它也会自动让您登录,因为您的 MSFT 凭据已由浏览器保存。如果您转到您的 MSFT 帐户并注销,您将需要在 Azure 中设置一个注销 URI,该 URI 将告诉您的应用程序也注销。或者您可以设置您的应用程序以在您注销时摆脱办公室 cookie。

于 2020-08-30T07:23:34.890 回答