【问题标题】:Getting First Name/Last Name/Email from Twitter using OAuth使用 OAuth 从 Twitter 获取名字/姓氏/电子邮件
【发布时间】:2012-01-31 22:17:45
【问题描述】:

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

我存储名字、姓氏和电子邮件。但是,当我从 oauth 提升 twitter 身份验证哈希时,我只能在身份验证哈希中获得昵称、名称、位置、图像、描述和 url。

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

【问题讨论】:

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


    【解决方案1】:

    Twitter by Design 不会传递您使用的电子邮件 ID。这是 API 团队深思熟虑的设计决定。

    这里有相同的主题供您参考

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

    【讨论】:

    • 谢谢 - 我应该搜索得更好:/
    【解决方案2】:

    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 很陌生,目前只需让会话创建操作一举处理此问题,无需用户交互。可能是另一个问题。
    • 不幸的是,Twitter 通过不提供电子邮件地址来强制您在注册过程中使用额外的步骤。您必须将用户重定向到一个注册表单,询问他们的电子邮件地址,或者使用不同的注册服务,如 Facebook,如果您希望它是无缝的,它会提供电子邮件地址。
    • 是的 - 目前我正在使用 Facebook 和 Google - 我可能会因此放弃 Twitter。
    • 您可以稍后添加它并检查if social_params["provider"] == "twitter",并在必要时重定向到注册表单。
    • 太棒了!感谢@iWasRobbed 的提示!
    【解决方案3】:

    如果您与 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】:

      OmniAuth 将所有名称组合在一个字符串中。但是,有些人有两个以上的名字,例如“John Clark Smith”。您可以选择以三种不同的方式处理这些问题:

      (1) 名:“约翰”,姓:“史密斯”

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

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

        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】:

        供php使用:

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

        请注意,名称可能有多个姓氏,也可能有多个名字,这涉及多个姓氏而不是名字。

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2023-02-02
            • 2016-08-01
            • 2019-06-15
            • 2017-03-05
            • 2016-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-17
            相关资源
            最近更新 更多