使用OAuth验证用户的Twitter身份后,是否可以获取用户的电子邮件ID?


85

我是OAuth的新手,并且一直在使用Twitter API。通过向发送请求,我可以在身份验证后获取用户的凭据http://api.twitter.com/1/account/verify_credentials.xml。响应中包含用户ID,屏幕名称等,但不包含电子邮件ID。

是否可以完全检索用户的电子邮件ID?

更新资料

我相信,如果您明确要求扩展权限, Facebook会提供此信息。Twitter有类似的东西吗?


@Philip::PI同意,我怀疑没有,但我想核实并向“签署支票的人”报告。
Manoj Govindan

2
@Philip Potter为什么这么说?电子邮件地址是大多数oauth提供程序之间的关键参考点。如果您拥有一个具有第三方登录功能的网站(例如该网站),并且用户使用Twitter登录,则只有可以使用的唯一标识符是user_id。如果下一次该用户出现并使用google登录,则您将无法知道该用户与以前相同。但是,如果两个不同的第三方提供者提供了一个电子邮件地址,那么我们可以确定它是同一个人(只要该电子邮件地址已由第三方进行了验证)
mulllhausen 2011年

@mulllhausen同一个人仍然可以拥有不同的电子邮件帐户。拥有电子邮件选项虽然更好。通过一个提供商对您进行身份验证后,我便可以将多个帐户配对在一起,而不必依赖Twitter不支持的电子邮件地址。我只是说说你拥有的东西。
杰森·塞布林2013年

Answers:


106

无法通过API检索用户的电子邮件地址。这是API团队的故意设计决定。

更新2015.08.18:

可以向用户请求电子邮件地址,但这需要将您的应用列入白名单。请参阅https://dev.twitter.com/rest/reference/get/account/verify_credentials,以获取API调用的详细信息以及此表格以请求将您的应用列入白名单。


11
我们可以将其归档为bug,我非常需要经过身份验证的用户的电子邮件地址吗?
iMOBDEV 2011年

9
太糟糕了,就像您说的那样,是故意的决定。如果要对某人进行身份验证并拥有自己的用户数据库,则需要检查是否已存在一个现有用户(具有相同的电子邮件)。
Keyne Viana

4
@JigneshBrahmkhatri我的应用程序中现有的用户模型存在相同的问题,该模型需要一个电子邮件地址。我通过执行额外的步骤来解决该问题,并向用户显示一个表单以完成丢失的信息。
肯尼·迈耶

24
@KennyM。这不是很安全,我可以输入一些不是我的帐户的电子邮件并将其与该帐户配对...
Brian Graham

3
当用户使用Twitter登录时,我还要求他们输入电子邮件地址,然后让他们在激活帐户之前进行验证。基本上,我只是让他们使用他们的Twitter帐户,而不需要密码。
Gus Shortz 2013年

16

对于使用Python / Django编写的OutsourceFactor,我通过oAuth1获取用户名,然后将电子邮件构造为“ username@twitter.com”,该电子邮件在Twitter上将是唯一的。然后,我对它进行哈希处理以获得一个不错的UUID,该UUID可以使用并与我的本地用户帐户关联。雅虎也一样。Google和Facebook使用oAuth2,他们可以根据要求给我电子邮件地址,这很好。

为确保单个帐户具有多个社交关联,我仅在用户本地创建一个帐户并登录后才允许社交帐户关联。

因此,您必须先创建一个帐户(本地帐户),然后才能使用任何社交oAuth提供程序来简化以后的登录。对于我的网站来说,这是最好的选择。

无论如何,您会从Twitter获得一些独特的ID形式。因此,只需使用它。您可以在关联之后或之前请求电子邮件地址。


4
我不同意“让您轻松登录的提供者”,因为您已经给他们带来麻烦,要求他们通过显示客户总是不愿填写的非常大的表格来创建本地帐户。
RJR

@RJR好吧,Twitter没有给您提供电子邮件地址。所以无论如何你都必须要它。就我而言,我在输入密码时也要求输入密码。您可能有一个具有不同要求的站点,这也很好。
Un33k

3

Twitter在OAuth响应中混淆了电子邮件地址。对于希望包括“向Twitter注册”功能的人们来说,这一直是一个大问题。

最近(2015年初),Twitter通过第二次服务电话增加了电子邮件地址支持,但在某些情况下会受到滥用。

https://dev.twitter.com/rest/reference/get/account/verify_credentials

因此,现在有可能,但我的意见是继续实施OAuth的“每个提供商都可以推特”的单点登录。必须抵制它们,直到它们正常运行为止,我的意思是像其他每个OAuth提供程序一样。


3

在使用Fabric的Android中,我请求用户的电子邮件地址,如下所示:

TwitterAuthClient authClient = new TwitterAuthClient();

authClient.requestEmail(session, new Callback<String>() {

    @Override
    public void success(Result<String> result) {
        // Do something with the result, which provides the email address
    }

    @Override
    public void failure(TwitterException exception) {
      // Do something on failure
    }
});

参见http://docs.fabric.io/android/twitter/request-user-email-address.html


是的,我为Android做同样的事情,但无法获取网络中的电子邮件地址,我也通过以下链接提交电子邮件地址请求dev.twitter.com/rest/reference/get/account/verify_credentials
Muhammad Waqas

1

就我而言,每次获得响应时,我都会为每个用户获得唯一的身份验证ID,并且每次都为该用户获得相同的身份验证ID。因此,我使用该ID创建了一个电子邮件,例如unique_id@twitter.com,并检查该电子邮件是否已经在我的网站上(第一次不是),然后注册该用户。然后,如果他第二次登录,我会再次创建电子邮件,并检查它是否已经存在。这样,我不必让他先创建一个本地帐户即可识别他的登录名。


1

这是如何在Laravel中获取Twitter用户电子邮件的示例,在coditty.com上,您可以使用Angular + Laravel找到完整的示例

 // get token secret from db 
        $token = TwitterTokens::where('oauth_token', $request->input('oauth_token'))->first(); 


        // open twitter connection
        $connection = new \Abraham\TwitterOAuth\TwitterOAuth(
                        $this->twitter_consumer_key, 
                        $this->twitter_secret, 
                        $request->input('oauth_token'), 
                        $token->oauth_token_secret// twitter secret from DB
                        );

        // get acces token
        $access_token = $connection->oauth("oauth/access_token", ["oauth_verifier" => $request->input('oauth_verifier')]); 

         // new TwitterOAuth instance to get email
        $twitterOAuth = new \Abraham\TwitterOAuth\TwitterOAuth( $this->twitter_consumer_key, $this->twitter_secret, $access_token['oauth_token'], $access_token['oauth_token_secret'] );

        // Let's get the user's info with email
        $twitterUser = $twitterOAuth->get('account/verify_credentials', ['include_entities' => 'false','include_email'=>'true','skip_status'=>'true',]);


        // output user object from twitter in your Log file
        Log::info(['user'=>$twitterUser]);

1
始终欢迎潜在解决方案的链接,但是请在该链接周围添加上下文,以便您的其他用户会知道它的含义和存在的原因。如果目标站点无法访问或永久离线,请始终引用重要链接中最相关的部分。考虑到为什么仅仅是删除一个外部站点的链接以及为什么删除一些答案的可能原因
Tunaki

0

谁说这是不可能的?

将应用列入白名单后,我便进入了我的iOS应用。在这里检查我的答案。


0

添加此代码!

$params = array('include_email' => 'true', 'include_entities' => 'false', 'skip_status' => 'true');

`$data = $connection->get('account/verify_credentials', $params); // get the data`

// getting twitter user profile details $twt_id = $data->id; //twitter user id $twt_email = $data->email; //twitter user email

在此处结帐完整程序


0

谁说您无法收到用户电子邮件,在apps.twitter.com的应用程序权限下可以使用“向用户请求电子邮件地址”复选框。必须在应用程序设置中填写“隐私政策URL”和“服务条款URL”字段,才能使电子邮件地址访问正常。如果启用,则会通过oauth / authorize对话框通知用户您的应用程序可以访问其电子邮件地址。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.