¿Hay alguna manera de obtener la identificación de correo electrónico de un usuario después de verificar su identidad de Twitter usando OAuth?

85

Soy nuevo en OAuth y he estado jugando con la API de Twitter. Puedo obtener las credenciales de un usuario después de la autenticación haciendo una solicitud a http://api.twitter.com/1/account/verify_credentials.xml. La respuesta contiene la identificación del usuario, el nombre de pantalla, etc. pero no la identificación del correo electrónico.

¿Es posible recuperar el ID de correo electrónico del usuario?

Actualizar

Creo que Facebook proporciona esta información si solicita específicamente permisos extendidos . ¿Hay algo similar para Twitter?

Manoj Govindan
fuente
@Philip:: PI está de acuerdo y sospecho que no, pero quería verificar e informar a El que firma los cheques.
Manoj Govindan
2
@Philip Potter, ¿por qué dices esto? la dirección de correo electrónico es el punto de referencia clave entre la mayoría de los proveedores de oauth. Si tiene un sitio web con funcionalidad de inicio de sesión de terceros (como este sitio web) y un usuario inicia sesión con Twitter, entonces el único identificador único que se puede utilizar es user_id. Si la próxima vez que aparece el usuario e inicia sesión en Google, no tiene forma de saber que es el mismo usuario que antes. sin embargo, si dos proveedores externos diferentes dan una dirección de correo electrónico, podemos estar seguros de que es la misma persona (siempre que la dirección de correo electrónico sea verificada por terceros)
mulllhausen
@mulllhausen la misma persona puede tener diferentes cuentas de correo electrónico de todos modos. Sin embargo, es mejor tener la opción de correo electrónico. Me gustaría incorporar en esto la capacidad de emparejar varias cuentas después de que se autentique a través de un proveedor en lugar de confiar en la dirección de correo electrónico que Twitter no admite. Solo estoy diciendo que sigas con lo que tienes.
Jason Sebring

Respuestas:

106

La dirección de correo electrónico del usuario no se puede recuperar a través de la API. Esta es una decisión de diseño deliberada del equipo de API.

ACTUALIZACIÓN 2015.08.18:

Es posible solicitar una dirección de correo electrónico a los usuarios, pero requiere que su aplicación esté incluida en la lista blanca. Consulte https://dev.twitter.com/rest/reference/get/account/verify_credentials para obtener detalles de la llamada a la API y este formulario para solicitar la inclusión en la lista blanca de su aplicación.

DWRoelands
fuente
11
¿Podemos archivarlo como error, necesito muchísimo la dirección de correo electrónico del usuario autenticado?
iMOBDEV
9
Lástima y como has dicho, una decisión deliberada . Si está autenticando a alguien y tiene su propia base de datos de usuarios, debe verificar si ya existe un usuario existente (con el mismo correo electrónico).
Keyne Viana
4
@JigneshBrahmkhatri Tuve el mismo problema con mi modelo de usuario existente en mi aplicación que requería una dirección de correo electrónico. Lo solucioné dando un paso adicional y mostrando al usuario un formulario para completar la información que faltaba.
Kenny Meyer
24
@KennyM. Eso no es muy seguro, podría simplemente escribir el correo electrónico de alguna cuenta que no sea mía y emparejarme con esa cuenta ...
Brian Graham
3
Cuando un usuario inicia sesión con Twitter, le solicito que ingrese también una dirección de correo electrónico y que luego la verifique antes de activar su cuenta. Básicamente, solo les dejo usar su cuenta de Twitter en lugar de requerir una contraseña.
Gus Shortz
16

Para OutsourceFactor , que está escrito en Python / Django, obtengo el nombre de usuario a través de oAuth1, luego construyo un correo electrónico como "[email protected]" que se garantiza que será único en todo Twitter. Luego lo hash para obtener un buen UUID para usar y asociar con mi cuenta de usuario local. Lo mismo ocurre con Yahoo. Google y Facebook usan oAuth2 y me dan la dirección de correo electrónico a pedido, lo cual es bueno.

Para garantizar múltiples asociaciones sociales con una sola cuenta, permito asociaciones de cuentas sociales SOLAMENTE después de que el usuario haya creado una cuenta localmente y haya iniciado sesión.

Por lo tanto, primero debe crear una cuenta (cuenta local), luego puede usar cualquiera de los proveedores de oAuth sociales para facilitar sus inicios de sesión futuros. Esta es la mejor inversión para mi sitio.

De todos modos, obtienes alguna forma única de identificación de Twitter. Así que úsala. Puede solicitar una dirección de correo electrónico más tarde o antes de la asociación.

un33k
fuente
4
"proveedores para facilitar sus futuros inicios de sesión", no estoy de acuerdo con esto, porque ya les ha causado problemas al pedirles que creen una cuenta local mostrando un formulario muy grande que al Cliente siempre le disgusta llenar.
RJR
@RJR Bueno, Twitter no te da una dirección de correo electrónico. Así que tienes que pedirlo de todos modos. En mi caso, también pido una contraseña mientras estoy en ello. Es posible que tenga un sitio con diferentes requisitos, y eso también está bien.
un33k
3

La dirección de correo electrónico está ofuscada por Twitter en sus respuestas de OAuth. Lo que siempre ha sido un gran problema para las personas que desean incluir una función de "Registrarse en Twitter".

Más recientemente (principios de 2015), Twitter agregó soporte para direcciones de correo electrónico a través de una segunda llamada de servicio, pero bajo ciertas condiciones de abuso.

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

Así que ahora es posible, pero mi opinión es continuar implementando un inicio de sesión único de OAuth para todos los proveedores excepto Twitter. Deben ser boicoteados hasta que actúen normalmente, es decir, como cualquier otro proveedor de OAuth.

Niño de la luna
fuente
3

En Android usando Fabric , solicito la dirección de correo electrónico del usuario de esta manera:

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
    }
});

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

Paul Muriithi
fuente
sí, hago lo mismo para Android pero no puedo obtener la dirección de correo electrónico en la web. También envío una solicitud de dirección de correo electrónico siguiendo este enlace dev.twitter.com/rest/reference/get/account/verify_credentials
Muhammad Waqas
1

En mi caso, cada vez que obtengo la respuesta, obtengo una identificación de autenticación única para cada usuario y es la misma para ese usuario cada vez. Entonces usé esa identificación para crear un correo electrónico como [email protected] y verificar si ya está en mi sitio (por primera vez no lo está) y luego registrar al usuario. Luego, si inicia sesión por segunda vez, simplemente vuelvo a crear el correo electrónico y verifico si ya está allí. Con esto, no tengo que obligarlo a crear una cuenta local primero y poder identificarlo para iniciar sesión.

Mehedi Hasan
fuente
1

Aquí está el ejemplo de cómo obtener el correo electrónico de los usuarios de Twitter en Laravel, y en coditty.com puede encontrar el ejemplo completo usando 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]);
Igor Simic
fuente
1
Un enlace a una posible solución siempre es bienvenido, pero agregue contexto alrededor del enlace para que sus compañeros usuarios tengan una idea de qué es y por qué está allí. Siempre cite la parte más relevante de un enlace importante, en caso de que el sitio de destino sea inaccesible o se desconecte permanentemente. Tenga en cuenta que ser apenas más que un enlace a un sitio externo es una posible razón de por qué y cómo se eliminan algunas respuestas. .
Tunaki
0

¿Quién dijo que no es posible?

Entré en mi aplicación iOS después de incluirla en la lista blanca. Mira mi respuesta aquí .

NSPratik
fuente
0

¡Agrega este código!

$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

Consulte el procedimiento completo aquí .

Pran
fuente
0

Quien dice que no puede recibir el correo electrónico de los usuarios, la casilla de verificación "Solicitar direcciones de correo electrónico de los usuarios" está disponible en los permisos de la aplicación en apps.twitter.com . Los campos URL de la Política de privacidad y URL de los Términos de servicio deben completarse en la configuración de la aplicación para que el acceso a la dirección de correo electrónico funcione. Si está habilitado, los usuarios serán informados a través del cuadro de diálogo oauth / autorizar que su aplicación puede acceder a su dirección de correo electrónico.

Emmanuel Ikechukwu
fuente