在使用OAuth验证Twitter身份后,有没有一种方法可以获取用户的电子邮件ID?

85

我刚接触OAuth并尝试使用Twitter API。通过向http://api.twitter.com/1/account/verify_credentials.xml发送请求,我能够获取用户的凭证,其中包含用户ID、用户名等信息,但没有电子邮件地址。

是否有可能获取用户的电子邮件地址?

更新

我相信Facebook可以在您特别请求扩展权限时提供此信息。Twitter是否有类似的功能呢?


@Philip: :P 我同意,我怀疑没有,但我想验证并向签发支票的人报告。 - Manoj Govindan
2
@Philip Potter 你为什么这么说?电子邮件地址是大多数OAuth提供者之间的关键参考点。如果您拥有具有第三方登录功能(例如此网站)的网站,并且用户使用Twitter登录,则唯一可用的标识符是user_id。如果下次用户使用Google登录,则您无法知道这是否与以前相同的用户。但是,如果两个不同的第三方提供商提供电子邮件地址,则我们可以确定它是同一个人(只要第三方验证了电子邮件地址)。 - mulllhausen
@mulllhausen同一个人可以有不同的电子邮件账户。但是,拥有电子邮件选项会更好。我建议在您通过一个提供商进行身份验证后,将多个帐户配对在一起的功能集成到其中,而不是依赖于电子邮件地址,因为Twitter不支持此功能。我的意思是,使用您现有的功能继续前进。 - King Friday
9个回答

106

11
我们可以将它作为错误报告,因为我非常需要经过验证的用户的电子邮件地址。 - jigneshbrahmkhatri
9
很遗憾,就像你所说的,这是一个“故意的”决定。如果你正在验证某个人并拥有自己的用户数据库,那么需要检查是否已经存在一个相同电子邮件的现有用户。 - Keyne Viana
4
@JigneshBrahmkhatri 我在我的应用程序中的现有用户模型中遇到了同样的问题,需要一个电子邮件地址。我通过采取额外的步骤并向用户显示一个表单来完成缺失的信息来解决了这个问题。 - Kenny Meyer
24
@KennyM. 这并不太安全,我可以输入一个非自己账户的电子邮件地址,然后与那个账户匹配... - Nahydrin
3
当用户使用 Twitter 登录时,我要求他们同时输入电子邮件地址,并在激活账户之前进行验证。基本上,我只是让他们使用他们的 Twitter 账户而不是要求设置密码。 - Gus Shortz
显示剩余9条评论

16
OutsourceFactor 是用 Python / Django 编写的。我通过 oAuth1 获取用户名,然后构建一个电子邮件地址,如 "username@twitter.com",这个地址在 Twitter 上保证是唯一的。接着,我将它哈希化,得到一个漂亮的 UUID,用于与我的本地用户账户相关联。Yahoo 也是同样的方式。Google 和 Facebook 使用 oAuth2,并在请求时提供邮箱地址,这很方便。
为了确保单个账户有多个社交关联,我允许只有在用户已经创建了本地账户并登录后,才能关联社交账户。
因此,您必须先创建一个本地账户,然后才可以使用任何社交 oAuth 提供者来简化您未来的登录。对我的网站来说,这是最佳选择。
无论如何,您从 Twitter 获取某些唯一形式的 ID。所以就直接用它吧。您可以在关联之前或之后要求邮箱地址。

4
“providers to ease your future logins”(提供商以便您未来的登录),我不同意这个,因为您已经通过展示一个非常大的表格要求他们创建本地账户,这已经给了他们麻烦,而顾客通常不喜欢填写。 - RJR
@RJR 好吧,Twitter不会给你提供电子邮件地址。所以你必须要去请求它。在我的情况下,我一边请求电子邮件地址,一边也会请求密码。你可能有不同的要求,那也没关系。 - Avid Coder

3
在Android中使用Fabric,我这样请求用户的电子邮件地址:
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 上做同样的事情,但无法在 web 上获取电子邮件地址。我还通过以下链接提交了获取电子邮件地址的请求:https://dev.twitter.com/rest/reference/get/account/verify_credentials - Muhammad Waqas

3

在Twitter的OAuth响应中,电子邮件地址被混淆。对于想要包含“使用Twitter注册”的功能的人来说,这一直是一个大问题。

最近(2015年初),Twitter通过第二个服务调用添加了电子邮件地址支持,但在某些被滥用的情况下。

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

现在已经有可能实现每个提供程序但Twitter的OAuth单点登录,但我的意见是继续实施。他们必须被抵制,直到他们表现得像其他每个OAuth提供商一样正常。


1
在我的情况下,每次我收到响应时,我都会为每个用户获得一个唯一的身份验证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
加入这段代码!

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

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

// 获取 Twitter 用户资料详情 $twt_id = $data->id; //Twitter 用户 ID $twt_email = $data->email; //Twitter 用户电子邮件

查看完整流程此处.


0
“谁说不可能??” 在将应用程序列入白名单后,我已经在我的iOS应用程序中实现了它。 查看我的答案这里

0

谁说你不能获取用户邮箱?在apps.twitter.com的应用权限下,有一个“要求用户提供电子邮件地址”的复选框可供选择。为了使访问电子邮件地址功能生效,隐私政策URL和服务条款URL字段必须在应用程序设置中完成。如果启用该功能,用户将通过 oauth / authorize对话框被告知您的应用程序可以访问他们的电子邮件地址。


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