OmniAuth& openid:从openid提供者获取某些字段

时间:2010-10-17 03:24:26

标签: ruby-on-rails openid omniauth

我正在使用rails gem:OmniAuth登录用户。

当使用OpenId提供程序时,我想获得某些字段,例如电子邮件和昵称,但我没有看到任何关于此的文档。

有什么想法吗?

感谢

6 个答案:

答案 0 :(得分:4)

您是在询问如何申请这些数据,或者如何确保获得该数据?您可以使用OpenID AX属性请求数据,但OpenID提供程序没有义务响应您的请求。这应该是一些帮助:

Retrieve OpenID AX attributes from Google / Yahoo in Rails

Google似乎只会通过电子邮件回复

http://schema.openid.net/contact/email

而雅虎将回复

http://axschema.org/contact/email

答案 1 :(得分:2)

您可能会发现Ryan Bates的this Railscast (towards the end)对于通过OpenID进行身份验证时捕获电子邮件地址非常有用。对于其他可用字段,我猜您在进行身份验证请求时可以向身份验证控制器添加以下内容

# authentications_controller.rb
...
def create
  omniauth = request.env["omniauth.auth"]
  raise omniauth.to_yaml
  ...
end
...

然后通过openID登录并查看您有哪些选项。

答案 2 :(得分:1)

在Devise omniauth集成文档的“Google”openID部分下有一些说明:

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

在User模型和控制器子类find_for_open_id中查找类方法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

答案 3 :(得分:0)

request.env ['omniauth.auth']应该有你需要的东西。对于Twitter,它返回类似

的内容
{
  'uid' => '12356',
  'provider' => 'twitter',
  'user_info' => {
    'name' => 'User Name',
    'nickname' => 'username',
    # ...
  }
}

只需检查它是否为openid。

答案 4 :(得分:0)

request.env ['omniauth.auth']将包含来自回调的整个响应。但并非所有提供商都返回用户电子邮件(推特不会)。通过谷歌或雅虎的OpenID应该有电子邮件作为'user_info'哈希的一部分。

答案 5 :(得分:0)

在初始化块中配置omniauth时,可以覆盖任何选项,包括必填字段和可选字段。根据文档,使用Builder获取您需要配置的内容。 EG:

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