visual tutorial studio por example español crear autenticacion c# asp.net twitter twitter-oauth

tutorial - Obtenga el correo electrónico del usuario de la API de Twitter para la autenticación de inicio de sesión externo ASP.NET MVC C#



web api rest c# (2)

Revisé un par de preguntas relacionadas para encontrar una respuesta a mi pregunta, pero todo fue en vano. Esta pregunta ¿Podemos obtener un ID de correo electrónico de Twitter oauth API? me llegó tan lejos como obtener el soporte de Twitter para permitir el permiso en mi aplicación a continuación: Usando este documento como guía y el código de la respuesta marcada (modificándolo un poco)

var resource_url = "https://api.twitter.com/1.1/account/verify_credentials.json"; var postBody = "include_email=true";// resource_url += "?" + postBody;

para generar una firma y hacer una solicitud para obtener los detalles del usuario de los resultados de Twitter en 401 No autorizado en mi aplicación MVC.

Sin embargo, cuando uso la herramienta generador de firmas de twitter para generar el encabezado de autorización y uso el violín para hacer una solicitud GET a https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true , recibo el correo electrónico solo una vez y tengo que regenerar las teclas de mi aplicación en twitter para obtenerla nuevamente.

¿Hay algún documento sobre cómo generar una firma válida y hacer una solicitud válida para recuperar el correo electrónico del usuario de Twitter a través de .Net TwitterAuthentication?


Después de casi quedarme calvo por sacarme todos los pelos de la cabeza, finalmente conseguí que funcionara. Descubrí que la cadena base de Firma era ligeramente diferente de la generada con mi código. Después de pequeños retoques, pude generar una cadena base de firmas válida.

En Startup.cs , agregué access_token y access_secret como reclamos. No utilicé el que se encuentra en mi aplicación porque los usuarios necesitan invocar uno nuevo cuando intentan iniciar sesión o registrarse:

var twitterOptions = new Microsoft.Owin.Security.Twitter.TwitterAuthenticationOptions() { ConsumerKey = ConfigurationManager.AppSettings["consumer_key"], ConsumerSecret = ConfigurationManager.AppSettings["consumer_secret"], Provider = new Microsoft.Owin.Security.Twitter.TwitterAuthenticationProvider { OnAuthenticated = (context) => { context.Identity.AddClaim(new System.Security.Claims.Claim("urn:twitter:access_token", context.AccessToken)); context.Identity.AddClaim(new System.Security.Claims.Claim("urn:twitter:access_secret", context.AccessTokenSecret)); return Task.FromResult(0); } }, BackchannelCertificateValidator = new Microsoft.Owin.Security.CertificateSubjectKeyIdentifierValidator(new[] { "A5EF0B11CEC04103A34A659048B21CE0572D7D47", // VeriSign Class 3 Secure Server CA - G2 "0D445C165344C1827E1D20AB25F40163D8BE79A5", // VeriSign Class 3 Secure Server CA - G3 "7FD365A7C2DDECBBF03009F34339FA02AF333133", // VeriSign Class 3 Public Primary Certification Authority - G5 "39A55D933676616E73A761DFA16A7E59CDE66FAD", // Symantec Class 3 Secure Server CA - G4 "‎add53f6680fe66e383cbac3e60922e3b4c412bed", // Symantec Class 3 EV SSL CA - G3 "4eb6d578499b1ccf5f581ead56be3d9b6744a5e5", // VeriSign Class 3 Primary CA - G5 "5168FF90AF0207753CCCD9656462A212B859723B", // DigiCert SHA2 High Assurance Server C‎A "B13EC36903F8BF4701D498261A0802EF63642BC3" // DigiCert High Assurance EV Root CA }), CallbackPath = new PathString("/twitter/account/ExternalLoginCallback") }; app.UseTwitterAuthentication(twitterOptions);

Y finalmente en mi controlador, llamé a mi clase de ayudante para obtener el nombre y el correo electrónico de Twitter:

if (loginInfo.Login.LoginProvider.ToLower() == "twitter") { string access_token = loginInfo.ExternalIdentity.Claims.Where(x => x.Type == "urn:twitter:access_token").Select(x => x.Value).FirstOrDefault(); string access_secret = loginInfo.ExternalIdentity.Claims.Where(x => x.Type == "urn:twitter:access_secret").Select(x => x.Value).FirstOrDefault(); TwitterDto response = MyHelper.TwitterLogin(access_token, access_secret, ConfigurationManager.AppSettings["consumer_key"], ConfigurationManager.AppSettings["consumer_secret"]); // by now response.email should possess the email value you need }

Método de la clase Helper:

Esta fue la sección que pellizqué para hacer una solicitud válida:

baseString = string.Concat ("GET &", Uri.EscapeDataString (resource_url) + "&" + Uri.EscapeDataString (request_query), "% 26", Uri.EscapeDataString (baseString));

public static TwitterDto TwitterLogin(string oauth_token, string oauth_token_secret, string oauth_consumer_key, string oauth_consumer_secret) { // oauth implementation details var oauth_version = "1.0"; var oauth_signature_method = "HMAC-SHA1"; // unique request details var oauth_nonce = Convert.ToBase64String( new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString())); var timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString(); var resource_url = "https://api.twitter.com/1.1/account/verify_credentials.json"; var request_query = "include_email=true"; // create oauth signature var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" + "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}"; var baseString = string.Format(baseFormat, oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_token, oauth_version ); baseString = string.Concat("GET&", Uri.EscapeDataString(resource_url) + "&" + Uri.EscapeDataString(request_query), "%26", Uri.EscapeDataString(baseString)); var compositeKey = string.Concat(Uri.EscapeDataString(oauth_consumer_secret), "&", Uri.EscapeDataString(oauth_token_secret)); string oauth_signature; using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))) { oauth_signature = Convert.ToBase64String( hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString))); } // create the request header var headerFormat = "OAuth oauth_consumer_key=/"{0}/", oauth_nonce=/"{1}/", oauth_signature=/"{2}/", oauth_signature_method=/"{3}/", oauth_timestamp=/"{4}/", oauth_token=/"{5}/", oauth_version=/"{6}/""; var authHeader = string.Format(headerFormat, Uri.EscapeDataString(oauth_consumer_key), Uri.EscapeDataString(oauth_nonce), Uri.EscapeDataString(oauth_signature), Uri.EscapeDataString(oauth_signature_method), Uri.EscapeDataString(oauth_timestamp), Uri.EscapeDataString(oauth_token), Uri.EscapeDataString(oauth_version) ); // make the request ServicePointManager.Expect100Continue = false; resource_url += "?include_email=true"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url); request.Headers.Add("Authorization", authHeader); request.Method = "GET"; WebResponse response = request.GetResponse(); return JsonConvert.DeserializeObject<TwitterDto>(new StreamReader(response.GetResponseStream()).ReadToEnd()); } } public class TwitterDto { public string name { get; set; } public string email { get; set; } }

Esto es todo lo que necesita para obtener el correo electrónico del usuario de Twitter. Espero que ayude a alguien a luchar con esto. Tenga en cuenta que los pasos mencionados en la pregunta también son muy importantes.


tienes que cambiar tu código para llamar al método GET account / verify_credentials después de que el usuario haya iniciado sesión con Twitter. Y es importante establecer el parámetro include_email en verdadero. Cuando se configura como verdadero, el correo electrónico se devolverá en los objetos del usuario como una cadena. Estoy usando esta biblioteca https://www.nuget.org/packages/linqtotwitter para no tener que escribir código para manejar las solicitudes de API de Twitter

var twitterCtx = new TwitterContext(authTwitter); var verifyResponse = await (from acct in twitterCtx.Account where (acct.Type == AccountType.VerifyCredentials) && (acct.IncludeEmail == true) select acct) .SingleOrDefaultAsync();

mira cómo he hecho esto aquí http://www.bigbrainintelligence.com/Post/get-users-email-address-from-twitter-oauth-ap

es una solución fácil y limpia