我正在使用 rails gem: OmniAuth 来登录用户。
使用 OpenId 提供程序时,我想获得某些字段,例如电子邮件和昵称,但我没有看到任何关于此的文档。
有任何想法吗?
谢谢
我正在使用 rails gem: OmniAuth 来登录用户。
使用 OpenId 提供程序时,我想获得某些字段,例如电子邮件和昵称,但我没有看到任何关于此的文档。
有任何想法吗?
谢谢
您是在问如何请求该数据,或者如何确保您获得它?您可以使用 OpenID AX 属性请求数据,但 OpenID 提供者没有义务响应您的请求。不过,这应该会有所帮助:
在 Rails 中从 Google/Yahoo 检索 OpenID AX 属性
谷歌似乎只会回复一封电子邮件给
http://schema.openid.net/contact/email
而雅虎会回复
http://axschema.org/contact/email
您可能会发现Ryan Bates的这个 Railscast(接近尾声)对于在通过 OpenID 进行身份验证时捕获电子邮件地址很有用。对于其他可用字段,我想您可以在发出身份验证请求时向身份验证控制器添加以下内容
# authentications_controller.rb
...
def create
omniauth = request.env["omniauth.auth"]
raise omniauth.to_yaml
...
end
...
然后通过 openID 登录,看看你有什么选项。
在 Devise omniauth 集成文档的“Google”openID 部分下有一些说明:
https://github.com/plataformatec/devise/wiki/OmniAuth:-概述
查找find_for_open_id
User 模型中的类方法和控制器子类,了解如何从散列Users::OmniauthCallbacksController
传递数据。request.env["omniauth.auth"]
这与任何 OpenID 策略有关,而不仅仅是 Google 策略。
在准确定制您从 OpenID 提供者那里请求的属性方面,您最好制作自己的omniauth_openid
gem 克隆或子类,然后更改options
. (见:https ://github.com/intridea/omniauth-openid/blob/master/lib/omniauth/strategies/open_id.rb )
request.env['omniauth.auth'] 应该有你需要的。对于 Twitter,它返回类似
{
'uid' => '12356',
'provider' => 'twitter',
'user_info' => {
'name' => 'User Name',
'nickname' => 'username',
# ...
}
}
只需检查它的openid。
request.env['omniauth.auth'] 将包含来自回调的整个响应。但并非所有提供商都会返回用户电子邮件(推特不会)。通过 google 或 yahoo 的 OpenID 应该将电子邮件作为“user_info”哈希的一部分。
在初始化块中配置omniauth
时,您可以覆盖任何选项,包括必填和可选字段。根据文档,使用Builder
来获取您需要配置的内容。例如:
config.middleware.use OmniAuth::Builder do
provider :open_id, :name => 'my_provider',
:identifier => 'https://myprovider.com/openid/xrds',
:required => ['http://axschema.org/namePerson/first','http://axschema.org/namePerson/last','http://axschema.org/contact/email','http://axschema.org/my_provider/some_field']
end