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

6
我使用omniauth作为唯一的身份验证方法,以允许用户通过Facebook/Google/Twitter登录我的网站。
我存储用户的名字、姓氏和电子邮件地址。然而,当我从OAuth中提取Twitter授权哈希时,我只能得到昵称、姓名、地点、头像、描述和URLs。
是否有一个作用域可以在我的初始化器中传递,以获取用户的电子邮件并将姓名拆分为名字和姓氏字段?
6个回答

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。此外,这也没有考虑到其他文化中许多人有多个姓氏。


非常感谢。我不太确定如何在回调后请求电子邮件地址 - 我对Rails还很陌生,目前只是让会话创建操作一次性处理此操作而没有用户交互。这可能是SO上的另一个问题。 - Rapture
不幸的是,Twitter强制你在注册过程中使用一个额外的步骤,因为它不提供电子邮件地址。你必须将用户重定向到一个注册表单,要求他们提供电子邮件地址,否则就要使用其他的注册服务,比如Facebook,如果你想让它无缝地进行。 - iwasrobbed
是的 - 目前我正在使用Facebook和Google - 我可能会因此放弃Twitter。 - Rapture
3
如果需要的话,您随时可以通过添加 if social_params["provider"] == "twitter" 检查,并在必要时重定向到注册表单来稍后添加它。 - iwasrobbed
这还有效吗?我只能获取“screenName”而不能获取“name”的信息。 - mcoenca

2
使用当前的Twitter API可以获取电子邮件,但需要填写一个请求许可的表格。这个过程很简单和快速,具体说明请参见此处
引用:
请求用户的电子邮件地址需要您的应用程序被Twitter列入白名单。要请求访问权限,请使用此表格。一旦被列入白名单,“从用户请求电子邮件地址”复选框将在apps.twitter.com上的您的应用程序权限下可用。隐私政策URL和服务条款URL字段也将在设置下可用,这些对于电子邮件访问是必需的。如果启用,则用户将通过oauth/authorize对话框被告知您的应用程序可以访问他们的电子邮件地址。

1

谢谢 - 我应该更好地搜索 :/ - Rapture

0

对于 PHP 使用:

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

请注意,姓名可能有多个姓氏和多个名字,这处理了多个姓氏但不包括名字。


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
}

0

OmniAuth会将所有名称组合成一个字符串。但是,有些人的名字不只是两个单词,比如“John Clark Smith”。您可以选择以三种不同的方式处理这些名称:

(1) 名字: "John",姓氏: "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"

(2) 名字:「约翰·克拉克」,姓氏:「史密斯」

  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) 名字: "John", 姓氏: "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个单词,则它是名字。这个问题类似于这个


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接