我正在构建一个Rails应用程序,该应用程序通常在登录用户时针对本地Github Enterprise安装进行身份验证。我想让登录用户将他们的github.com
ID与我的应用程序中的帐户相关联,但很难弄清楚如何执行此操作。
具体来说,问题是两种身份验证方法都会在github
设置中使用omniauth
身份验证策略。但是,相关的OAUTH
网址以及我的内部回调控制器需要针对每种情况都有所不同(在一种情况下,我实际上想要登录,在另一种情况下,我只是想添加更多信息到current_user
)。不幸的是,据我所知,我只能配置一次github
策略,但我需要为两个不同的提供商设置两种不同的配置。
我一直在搜索Devise和Omniauth文档一段时间,但没有成功。我在这里完全叫错了树吗?如果没有,有人可以指出我正确的方向吗?
非常感谢,
斯特芬
答案 0 :(得分:0)
在对devise
来源进行一些挖掘之后,我找到了一个相当简单的解决方案。问题的核心是如何让devise
两次使用相同的omniauth
策略,但使用不同的API和回调网址。因此,我们需要在两个不同的提供商ID 和名称下注册两个omniauth-github
实例。要使其工作,您需要在第二个实例中显式提供策略类名称。所以,你们总能得到这样的东西:
# Github Enterprise login through standard github provider
config.omniauth :github,
Rails.configuration.ghe_oauth_id,
Rails.configuration.ghe_oauth_secret,
client_options: {
site: 'https://github-enterprise/api/v3',
authorize_url: 'https://github-enterprise/login/oauth/authorize',
token_url: 'https://github-enterprise/login/oauth/access_token'
},
scope: 'user repo'
# Github.com support using the same strategy, but with a different provider ID and name
config.omniauth :github_com,
Rails.configuration.github_com_oauth_id,
Rails.configuration.github_com_oauth_secret,
strategy_class: OmniAuth::Strategies::GitHub,
name: :github_com,
scope: 'user repo'
路由设置与单个omniauth
提供程序保持一致。在我的devise
回调的回调控制器中,我现在有一个方法github
用于通过Github Enterprise处理身份验证,一个github_com
用于github.com身份验证。