使用Linkedin的Omnoauth登录不提供信息散列中的电子邮件

时间:2012-03-26 13:56:22

标签: ruby-on-rails-3 email devise omniauth linkedin

我在LinkedIn上使用omniauth作为提供者。 LinkedIn没有提供 信息哈希中的电子邮件,因此在创建基于用户时我无法提供电子邮件 关于我得到的信息。

两个相关问题:

1)如何调整设计以便没有要求 for:电子邮件作为验证?它似乎没有设置在 用户模型。

2)但我确实希望获得电子邮件信息,所以想拥有 创建用户之前请求的电子邮件信息。我怎么能够 重定向到页面/向导,询问电子邮件信息,然后来 回来完成用户注册?

2 个答案:

答案 0 :(得分:1)

我刚刚解决了这个问题而不需要使用单独的'linkedin'宝石,因为有关该主题的文档明显不足,所以很难解决这个问题!

首先,您需要通过向LinkedIn Omniauth配置添加fields选项来使电子邮件地址可用,您还需要覆盖request_token_path以添加检索用户电子邮件地址所需的r_emailaddress范围。

我最终看起来像这样(NB.Ruby 1.9.3):

provider :linkedin, external_services['linkedin']['api_key'], external_services['linkedin']['api_secret'], client_options: {request_token_path: '/uas/oauth/requestToken?scope=r_emailaddress'}, fields: ['id', 'first-name', 'last-name', 'headline', 'industry', 'picture-url', 'public-profile-url', 'email-address']

注意:别忘了将external_services ['linkedin'] ['api_key']和external_services ['linkedin'] ['api_secret']更改为您自己的。

然后会要求您的用户授权使用他们的电子邮件地址以及他们的基本提供,一旦他们通过以下方式返回,您将可以访问它:

auth['extra']['raw_info']['emailAddress']

我应该将此更改提交回omniauth-linkedin,这样您就可以在提供程序选项中设置范围:r_emailaddress,避免重复使用字段名称并将电子邮件返回到auth对象的info部分。

如果我在项目的这一部分完成后得到时间,我会。

答案 1 :(得分:0)

看看有关omniauth的导轨:http://railscasts.com/episodes?utf8=%E2%9C%93&search=omniauth

这个想法如下:

  • 从omniauth信息
  • 创建新用户
  • 尝试保存用户
  • 由于电子邮件不存在,因此无法验证
  • 将omniauth数据存储在会话中,并redirect_to new_user_registration_url
  • 创建自己的注册控制器,继承自设计
  • 覆盖build_resource(*args)方法,如果存在omniauth数据,则使用它来创建资源(在您的情况下为User)

这样,在尝试使用linkedin登录后,用户将被重定向到他可以输入电子邮件的表单。

所有这些都在railscast中解释;)