Rails + Sorcery:将外部身份验证添加到现有用户

时间:2012-04-30 03:45:28

标签: ruby-on-rails authentication sorcery

我在Rails应用程序中使用Sorcery进行身份验证。我设置得很好,我可以通过用户名/密码或外部auth添加用户(目前仅使用twitter)。但是,我无法弄清楚的一件事是如何向现有用户添加身份验证,即。由用户名创建的用户,可能希望稍后将其Twitter帐户添加为登录方式。

我尝试在External模块中添加一个方法来启用此功能......

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而不是提供者。

在巫术中没有公开的方法。有没有人想出如何将这个功能修补到应用程序中?

2 个答案:

答案 0 :(得分:0)

我最近使用https://github.com/rcarter/sorcery添加了将提供程序链接到已经过身份验证的用户的功能。这会做你想要的吗?

我应该警告,虽然它试图在你的用户模型中存储access_token ...你可能想删除它。请在此处查看更改:https://github.com/rcarter/sorcery/commit/f3984749659bceb7f7438cae8ea95ba5a415d1e2

答案 1 :(得分: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. 将您的网络应用添加为注册的应用
  2. 下载用户的.csv,并使用该信息在“用户”表中创建用户个人资料。他们的电子邮件将是他们的用户名。
  3. 在您注册的应用程序下的Azure中创建客户端机密。
  4. 为您的应用添加网络重定向URI,例如http://localhost:32795/oauth/callback?provider=microsoft

在您的应用中:

  1. 在“身份验证”表中创建用户的身份验证条目。每个用户将 从“用户”表中获得其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,这将告诉您的应用程序也要注销。或者,您可以设置应用程序以在注销时摆脱办公室的cookie。