2016-03-31 7 views
11

मैंने अपने प्रश्न का उत्तर खोजने के लिए कुछ संबंधित प्रश्नों की जांच की है, लेकिन सभी को कोई फायदा नहीं हुआ है। Additional permissions इस doc एक गाइड के रूप और चिह्नित जवाब है (एक छोटा सा इसे संशोधित) code का उपयोगबाहरी लॉगिन प्रमाणीकरण के लिए ट्विटर एपीआई से उपयोगकर्ता का ईमेल प्राप्त करें एएसपी.नेट एमवीसी सी #

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

करने के लिए: यह सवाल Can we get email ID from Twitter oauth API? मुझे नीचे मेरे ऐप्स पर अनुमति देने की ट्विटर समर्थन मिल रहा है के रूप में जहाँ तक मिल गया एक हस्ताक्षर उत्पन्न करें और अपने एमवीसी ऐप में 401 अनधिकृत में ट्विटर परिणामों से उपयोगकर्ता के विवरण प्राप्त करने का अनुरोध करें।

हालांकि, जब मैं चहचहाना हस्ताक्षर जनरेटर टूल का उपयोग प्राधिकरण हैडर पैदा करते हैं और Fiddler उपयोग करने के लिए https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true को GET अनुरोध बनाने के लिए, मैं ईमेल केवल एक बार मिलता है और मैं इसे फिर से प्राप्त करने के लिए चहचहाना में मेरे एप्लिकेशन कुंजी को पुनर्जीवित करने के लिए है ।

क्या कोई वैध हस्ताक्षर उत्पन्न करने के बारे में कोई दस्तावेज़ है और ट्विटर उपयोगकर्ता प्रमाणीकरण के माध्यम से ट्विटर उपयोगकर्ता ईमेल पुनर्प्राप्त करने का एक वैध अनुरोध है?

उत्तर

15

लगभग सभी मेरे बाल मेरे सिर से खींचने से गंजा होने के बाद, मुझे अंत में यह काम करने के लिए मिला। मुझे पता चला कि हस्ताक्षर आधार स्ट्रिंग मेरे कोड से उत्पन्न एक से थोड़ा अलग था। छोटे बदलावों के बाद, मैं एक वैध हस्ताक्षर आधार स्ट्रिंग उत्पन्न करने में सक्षम था।

स्टार्टअप.cs में, मैंने access_token और access_secret दावों के रूप में जोड़ा। क्योंकि उन एक नया एक आह्वान करने के लिए के रूप में वे के लिए लॉग इन या पंजीकृत प्रयास की जरूरत है मैं अपने ऐप पर पाया एक का उपयोग नहीं किया:

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

और अंत में मेरी नियंत्रक में, मैं सिर्फ नाम पाने के लिए मेरे सहायक वर्ग कहा जाता है और चहचहाना से ईमेल:

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 
    } 

सहायक वर्ग विधि:

यह खंड मैं आदेश एक वैध अनुरोध करने के लिए में बदलाव किया गया था:

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

यह सब आप चहचहाना उपयोगकर्ता के ईमेल प्राप्त करने की आवश्यकता है। मुझे आशा है कि इससे किसी के साथ संघर्ष करने में मदद मिलेगी। कृपया ध्यान दें कि प्रश्न में उल्लिखित कदम भी बहुत महत्वपूर्ण हैं।

+2

यह एनईसी प्रयास था और – Webruster

+0

हाय ओलुवाफेमी साझा करने के लिए धन्यवाद, क्या यह कोड अभी भी आपके लिए काम कर रहा है? मुझे इस समस्या का सामना करना पड़ रहा है जहां मुझे ईमेल के लिए https://api.twitter.com/1.1/account/verify_credentials.json का अनुरोध करने का प्रयास करने पर हर बार 401 मिल रहा है .. मुझे ट्विटर से अनुमति मिली है, और जब मैं ट्विटर से हस्ताक्षर जनरेटर का उपयोग करता हूं (https://dev.twitter.com/oauth/tools/signature-generator/[APPID]) सब कुछ ठीक काम करता है। आपके कोड द्वारा बनाए गए प्राधिकरण शीर्षलेख बहुत पसंद करते हैं, लेकिन मेरे लिए काम नहीं करते हैं। क्या आपके पास शायद एक कामकाजी उदाहरण है? –

+0

@ गुइडो ऊपर उपयोग की जाने वाली सहायक विधि को काम करना चाहिए। यह वर्तमान में मेरी सभी लाइव साइटों पर काम कर रहा है। – Oluwafemi

0

उपयोगकर्ता को ट्विटर के साथ लॉग इन करने के बाद आपको GET खाता/verify_credentials विधि कॉल करने के लिए अपना कोड बदलना होगा। और पैरामीटर include_email को सत्य पर सेट करना महत्वपूर्ण है। जब यह सही ईमेल पर सेट होता है तो उपयोगकर्ता ऑब्जेक्ट्स में एक स्ट्रिंग के रूप में वापस किया जाएगा। मैं इस पुस्तकालय का उपयोग कर रहा https://www.nuget.org/packages/linqtotwitter ताकि मैं चहचहाना एपीआई से निपटने के लिए कोड लिखने की जरूरत नहीं है का अनुरोध करता है

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

देख मैं इस यहाँ कैसे किया है http://www.bigbrainintelligence.com/Post/get-users-email-address-from-twitter-oauth-ap

यह एक आसान और साफ समाधान है

संबंधित मुद्दे