2012-01-02 86 views
6

我使用omniauth专门允许用facebook/google/twitter登录我的网站。使用OAuth从Twitter获取名字/姓氏/电子邮件

我存储名字,姓氏和电子邮件。但是,当我从oauth提交Twitter auth哈希值时,我只能在auth哈希中获得昵称,名称,位置,图像,描述和url。

是否有我可以在我的初始化程序传递给用户的电子邮件和名称到first_name,last_name字段的范围?

回答

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,如果他们没有在他们的名字空间或他们没有给出姓氏。这也没有考虑到许多人在其他文化中有多个姓氏的事实。

+0

非常感谢。我不太清楚在回调之后如何处理电子邮件地址 - 我对rails非常陌生,目前只是让会话创建动作在没有用户交互的情况下一举处理。可能是SO的另一个问题。 – Rapture 2012-01-02 16:22:56

+0

不幸的是,Twitter强制您通过不发送电子邮件地址而在注册过程中使用一个额外的步骤。您必须将用户重定向到注册表单,要求他们输入他们的电子邮件地址,否则请使用Facebook等不同的注册服务,如果您希望它可以无缝连接,则可以提供电子邮件地址。 – iwasrobbed 2012-01-02 16:39:11

+0

是的 - 目前我正在使用Facebook和谷歌 - 我可能最终会因此而放弃推特。 – Rapture 2012-01-02 16:50:53

0

如果您已经与FB,Google和Twitter进行了集成,那么您需要在数据库中拥有第一个和最后一个(如果您的UI需要它>我的情况)。这是我想出了一些国家有超过2个令牌他们的名字前的人(马可·德弗兰卡·索利斯)或(马可,德弗兰卡·索利斯)

// + 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)FIRST_NAME: “约翰”,姓氏: “史密斯”

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: “约翰·克拉克”,姓氏:“史密斯“

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: ”约翰“,姓氏: ”克拉克史密斯“

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

0

PHP的使用:

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

注意名称可以有多个姓氏以及可能有多个firstnames,与多个姓氏此交易,但不firstnames。

2

使用当前的Twitter API是可能获取电子邮件。您必须填写申请该权限的表单。该过程非常简单快捷,其解释如下:here

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

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

相关问题