使用OAuth从Twitter获取名字/姓氏/电子邮件

时间:2012-01-02 15:47:47

标签: ruby-on-rails ruby-on-rails-3 oauth twitter-oauth

我使用omniauth专门允许使用facebook / google / twitter登录我的网站。

我存储名字,姓氏和电子邮件。但是,当我从oauth提出twitter auth哈希时,我只会在auth哈希中获得昵称,名称,位置,图像,描述和网址。

我是否可以在初始化程序中传递一个范围来获取用户的电子邮件并将名称分解为first_name,last_name字段?

6 个答案:

答案 0 :(得分:8)

Twitter不会发送用户电子邮件,因此您无法从Twitter API获取该信息。相反,您必须要求用户在您的注册表单中输入他们的电子邮件地址。

就分割名称而言,一旦你使用类似的东西返回哈希,你就会这样做:

social_params ||= request.env["omniauth.auth"]
fullname = social_params["user_info"]["name"].split(' ')
first_name, last_name = fullname[0], fullname[1]
puts "first name is #{first_name} and last name is #{last_name}"

请注意last_name如果他们的名字中没有空格或者他们没有姓名,可能是nil。这也没有考虑到许多人在其他文化中有多个姓氏的事实。

答案 1 :(得分:2)

使用当前的Twitter API 可能获取电子邮件。您必须填写申请该许可的表格。这个过程简单快捷,解释here

  

请求用户的电子邮件地址要求您的应用程序被Twitter列入白名单。要请求访问权限,请使用此表单。

     

一旦列入白名单,就会在apps.twitter.com上的应用权限下显示“向用户请求电子邮件地址”复选框。隐私政策URL和服务条款URL字段也将在电子邮件访问所需的设置下提供。如果启用,将通过oauth / authorize对话框通知用户您的应用可以访问其电子邮件地址。

答案 2 :(得分:1)

Twitter by Design不会通过你使用电子邮件ID。这是API团队的一个深思熟虑的设计决定。

这是您参考的相同主题

Is there a way to get an user's email ID after verifying her Twitter identity using OAuth?

答案 3 :(得分:0)

如果您与FB,Google和Twitter集成,则需要在数据库中拥有第一个和最后一个(如果您的UI需要>我的情况)。这就是我想到的,因为有些国家的名字有超过2个代币:(Marco De Franca Solis)或(Marco,De Franca Solis)

// + TEST CASES
var name1 = handleName("Marco De Franca Solis")
var name2 = handleName("first,last wer wer")
var name3 = handleName("aName")
var name4 = handleName("")
// - TEST CASES

handleName = function(input) {
    var n=input.indexOf(" ");
    n += input.indexOf(",");
    var result = {};
    if(n < 0){
        result.first = input
        result.last = ""
    }
    else{
        arr =  input.split(/[ ,]+/);
        result.first = arr[0]
        result.last = ""
        if(arr.length > 1)
        {
            arr[0] = ""
            result.last = arr.join(" ");

        }
    }

    return result
}

答案 4 :(得分:0)

OmniAuth会在一个字符串中为您提供所有名称。但是,有些人有两个以上的名字,比如“John Clark Smith”。您可以选择以三种不同的方式对待它们:

(1)first_name:“John”,last_name:“Smith”

  def first_name
    if name.split.count > 1
      name.split.first
    else
      name
    end
  end

  def last_name
    if name.split.count > 1
      name.split.last
    end
  end

(2)first_name:“John Clark”,last_name:“Smith”

  def first_name
    if name.split.count > 1
      name.split[0..-2].join(' ')
    else
      name
    end
  end

  def last_name
    if name.split.count > 1
      name.split.last
    end
  end

(3)first_name:“John”,last_name:“Clark Smith”

  def first_name
    name.split.first
  end

  def last_name
    if name.split.count > 1
      name.split[1..-1].join(' ')
    end
  end

以上示例假设如果名称包含少于2个单词,则它是名字。此问题与this one

类似

答案 5 :(得分:0)

用于php:

$names = explode(' ',$socialData->firstName);
$socialData->firstName=array_shift($names);
$socialData->lastName=implode(' ',$names);

请注意,该名称可能有多个姓氏,可能还有多个姓氏,这可以处理多个姓氏,但不会处理名字。