มีวิธีรับรหัสอีเมลของผู้ใช้หลังจากยืนยันตัวตน Twitter โดยใช้ OAuth หรือไม่


85

ฉันยังใหม่กับ OAuth และได้เล่นกับ Twitter API http://api.twitter.com/1/account/verify_credentials.xmlฉันสามารถที่จะดึงข้อมูลประจำตัวของผู้ใช้หลังจากการตรวจสอบโดยการร้องขอไปยัง การตอบกลับประกอบด้วย ID ผู้ใช้ชื่อหน้าจอ ฯลฯ แต่ไม่ใช่ ID อีเมล

เป็นไปได้หรือไม่ที่จะดึงรหัสอีเมลของผู้ใช้

อัปเดต

ผมเชื่อว่า Facebook ให้ข้อมูลนี้โดยเฉพาะถ้าคุณขอสิทธิ์ในการขยาย มีอะไรที่คล้ายกันสำหรับ Twitter หรือไม่?


@Philip:: PI เห็นด้วยและฉันสงสัยว่าไม่มี แต่ฉันต้องการตรวจสอบและรายงานกลับไปที่ He Who Signs The Checks
Manoj Govindan

2
@ ฟิลิปพอตเตอร์ทำไมถึงพูดแบบนี้ ที่อยู่อีเมลเป็นจุดสำคัญในการอ้างอิงระหว่างผู้ให้บริการ oauth ส่วนใหญ่ หากคุณมีเว็บไซต์ที่มีฟังก์ชันการเข้าสู่ระบบของบุคคลที่สาม (เช่นเว็บไซต์นี้) และผู้ใช้ล็อกอินด้วย twitter จะมีเพียงตัวระบุที่ไม่ซ้ำกันซึ่งสามารถใช้ได้คือ user_id หากครั้งต่อไปที่ผู้ใช้เข้ามาและเข้าสู่ระบบด้วย google คุณจะไม่มีทางรู้เลยว่านี่คือผู้ใช้คนเดิม อย่างไรก็ตามหากผู้ให้บริการบุคคลที่สามที่แตกต่างกันสองรายให้ที่อยู่อีเมลเราก็มั่นใจได้ว่าเป็นบุคคลเดียวกัน (ตราบใดที่ที่อยู่อีเมลได้รับการยืนยันโดยบุคคลที่สาม)
mulllhausen

@mulllhausen บุคคลเดียวกันสามารถมีบัญชีอีเมลที่แตกต่างกันได้ ดีกว่าแม้ว่าจะมีตัวเลือกอีเมล ฉันอยากจะใช้ความสามารถในการจับคู่บัญชีหลายบัญชีเข้าด้วยกันหลังจากที่คุณได้รับการรับรองความถูกต้องผ่านผู้ให้บริการรายเดียวแทนที่จะใช้ที่อยู่อีเมลที่ twitter ไม่รองรับ ฉันแค่พูดกับสิ่งที่คุณมี
Jason Sebring

คำตอบ:


106

ไม่สามารถเรียกที่อยู่อีเมลของผู้ใช้ผ่าน API นี่เป็นการตัดสินใจออกแบบโดยเจตนาโดยทีม API

อัพเดท 2015.08.18:

เป็นไปได้ที่จะขอที่อยู่อีเมลจากผู้ใช้ แต่ต้องการให้แอปของคุณอยู่ในรายการที่อนุญาตพิเศษ โปรดดูhttps://dev.twitter.com/rest/reference/get/account/verify_credentialsสำหรับรายละเอียดของการเรียก API และแบบฟอร์มนี้เพื่อขออนุญาตแอปของคุณ


11
เราสามารถยื่นเป็นบั๊กได้หรือไม่ฉันต้องการที่อยู่อีเมลของผู้ใช้ที่ได้รับการรับรองความถูกต้องเป็นอย่างมาก?
iMOBDEV

9
แย่มากและอย่างที่คุณได้กล่าวไปแล้วว่าเป็นการตัดสินใจโดยเจตนา หากคุณกำลังพิสูจน์ตัวตนบุคคลอื่นและมีฐานข้อมูลผู้ใช้ของคุณเองคุณต้องตรวจสอบว่ามีผู้ใช้เดิม (ที่มีอีเมลเดียวกัน) อยู่แล้วหรือไม่
Keyne Viana

4
@JigneshBrahmkhatri ฉันมีปัญหาเดียวกันกับรูปแบบผู้ใช้ที่มีอยู่ในแอปพลิเคชันของฉันซึ่งต้องใช้ที่อยู่อีเมล ฉันแก้ไขโดยทำตามขั้นตอนเพิ่มเติมและแสดงแบบฟอร์มให้ผู้ใช้กรอกข้อมูลที่ขาดหายไป
Kenny Meyer

24
@KennyM. ไม่ปลอดภัยมากฉันสามารถพิมพ์อีเมลของบัญชีบางบัญชีที่ไม่ใช่ของฉันและจับคู่กับบัญชีนั้น ...
Brian Graham

3
เมื่อผู้ใช้ลงชื่อเข้าใช้ด้วย Twitter ฉันต้องการให้พวกเขาป้อนที่อยู่อีเมลด้วยจากนั้นให้พวกเขายืนยันก่อนเปิดใช้งานบัญชี โดยพื้นฐานแล้วฉันแค่ให้พวกเขาใช้บัญชี Twitter แทนการใช้รหัสผ่าน
Gus Shortz

16

สำหรับOutsourceFactorซึ่งเขียนด้วย Python / Django ฉันได้รับชื่อผู้ใช้ผ่านทาง oAuth1 จากนั้นสร้างอีเมลเป็น "username@twitter.com" ซึ่งรับประกันได้ว่าจะไม่ซ้ำกันตลอดทั้ง Twitter จากนั้นฉันก็แฮชเพื่อรับ UUID ที่ดีที่จะใช้และเชื่อมโยงกับบัญชีผู้ใช้ภายในของฉัน สิ่งเดียวกันสำหรับ Yahoo Google และ Facebook ใช้ oAuth2 และให้ที่อยู่อีเมลตามคำขอซึ่งดีมาก

เพื่อให้แน่ใจว่ามีการเชื่อมโยงทางสังคมหลายบัญชีด้วยบัญชีเดียวฉันอนุญาตให้มีการเชื่อมโยงบัญชีโซเชียลเฉพาะหลังจากที่ผู้ใช้สร้างบัญชีในเครื่องและเข้าสู่ระบบเท่านั้น

ดังนั้นคุณต้องสร้างบัญชีก่อน (บัญชีท้องถิ่น) จากนั้นคุณสามารถใช้ผู้ให้บริการ oAuth โซเชียลใดก็ได้เพื่อทำให้การเข้าสู่ระบบในอนาคตของคุณง่ายขึ้น นี่คือสิ่งที่ดีที่สุดสำหรับเจ้าชู้สำหรับไซต์ของฉัน

อย่างไรก็ตามคุณจะได้รับ ID รูปแบบเฉพาะจาก twitter ดังนั้นเพียงแค่ใช้มัน คุณสามารถขอที่อยู่อีเมลในภายหลังหรือก่อนการเชื่อมโยง


4
"ผู้ให้บริการเพื่อความสะดวกในการเข้าสู่ระบบในอนาคตของคุณ" ฉันไม่เห็นด้วยกับสิ่งนี้เพราะคุณได้ให้ปัญหากับพวกเขาแล้วโดยขอให้พวกเขาสร้างบัญชีท้องถิ่นโดยแสดงแบบฟอร์มที่ใหญ่มากซึ่งลูกค้ามักไม่ชอบกรอกข้อมูล
RJR

@RJR ดี Twitter ไม่ได้ให้ที่อยู่อีเมลกับคุณ ดังนั้นคุณต้องถามมันอย่างไรก็ตาม ในกรณีของฉันฉันขอรหัสผ่านด้วยในขณะที่ฉันอยู่ที่นั่น คุณอาจมีไซต์ที่มีข้อกำหนดที่แตกต่างออกไปและก็ใช้ได้เช่นกัน
un33k

3

ที่อยู่อีเมลถูกทำให้สับสนโดย Twitter ในการตอบสนอง OAuth ซึ่งเป็นปัญหาที่ดีสำหรับผู้ที่ต้องการรวมฟังก์ชัน "ลงทะเบียนด้วย Twitter" เสมอ

เมื่อไม่นานมานี้ (ต้นปี 2015) Twitter ได้เพิ่มการรองรับที่อยู่อีเมลผ่านการเรียกใช้บริการครั้งที่สอง แต่ภายใต้เงื่อนไขบางประการถูกละเมิด

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

ตอนนี้เป็นไปได้แล้ว แต่ความเห็นของฉันคือการใช้การลงชื่อเพียงครั้งเดียวของ OAuth ทุกผู้ให้บริการ แต่ทวิตเตอร์ต่อไป พวกเขาจะต้องถูกคว่ำบาตรจนกว่าพวกเขาจะทำตัวตามปกติฉันหมายถึงผู้ให้บริการ OAuth รายอื่น ๆ ทุกราย


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 แต่ไม่สามารถรับที่อยู่อีเมลในเว็บได้ฉันยังส่งคำขอที่อยู่อีเมลโดยไปที่ลิงค์นี้dev.twitter.com/rest/reference/get/account/verify_credentials
Muhammad Waqas

1

ในกรณีของฉันทุกครั้งที่ได้รับการตอบกลับฉันจะได้รับรหัสการตรวจสอบความถูกต้องที่ไม่ซ้ำกันสำหรับผู้ใช้ทุกคนและเหมือนกันสำหรับผู้ใช้รายนั้นทุกครั้ง ดังนั้นฉันจึงใช้ id นั้นสร้างอีเมลเช่น unique_id@twitter.com และตรวจสอบว่ามีอยู่ในไซต์ของฉันหรือไม่ (เป็นครั้งแรก) จากนั้นลงทะเบียนผู้ใช้ จากนั้นถ้าเขาเข้าสู่ระบบครั้งที่สองฉันเพิ่งสร้างอีเมลอีกครั้งและตรวจสอบว่ามีอยู่แล้วหรือไม่ ด้วยเหตุนี้ฉันไม่จำเป็นต้องให้เขาสร้างบัญชีท้องถิ่นก่อนและสามารถระบุตัวตนเพื่อเข้าสู่ระบบได้


1

นี่คือตัวอย่างวิธีรับอีเมลผู้ใช้ twitter ใน Laravel และใน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ว่าแอปของคุณสามารถเข้าถึงที่อยู่อีเมลของตนได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.