2012-01-02 151 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對話框通知您的應用程序可以訪問他們的電子郵件地址。

相關問題