401未经授权(webeexception),同时从通用应用程序在Twitter上发布状态

本文关键字:应用程序 Twitter 状态 布状态 授权 webeexception | 更新日期: 2023-09-27 18:02:58

我想给一个功能登录到Twitter & &;从Windows 8.1通用应用程序发布Tweet。请不要建议我去第三方库。我只想做两件事。我的努力如下。我怀疑我的认证是错的。我得到了System.Net。webeexception =>远程服务器返回错误:(401)Unauthorized。我的代码有什么问题,有人知道吗?

public const string TwitterClientID = "XXXXXXXXXXXL3nZGhtKURASXg";
public const string TwitterClientSecret = "5HBuM1FVXXXXXXXXXXXXXXqaSm1awtNSes";
public const string TwitterCallbackUrl = "http://f.com";
public const string TweetFromAPI = "Tweeting from API"; 
String Oauth_token = null;
String Oauth_token_secret = null;
private async Task TwitterLogin()
{
    TimeSpan SinceEpoch = (DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime());
    Random Rand = new Random();
    String TwitterUrl = "https://api.twitter.com/oauth/request_token";
    Int32 Nonce = Rand.Next(1000000000);
    String SigBaseStringParams = "oauth_callback=" + Uri.EscapeDataString(TwitterCallbackUrl);
    SigBaseStringParams += "&" + "oauth_consumer_key=" + TwitterClientID;
    SigBaseStringParams += "&" + "oauth_nonce=" + Nonce.ToString();
    SigBaseStringParams += "&" + "oauth_signature_method=HMAC-SHA1";
    SigBaseStringParams += "&" + "oauth_timestamp=" + Math.Round(SinceEpoch.TotalSeconds);
    SigBaseStringParams += "&" + "oauth_version=1.0";
    String SigBaseString = "POST&";
    SigBaseString += Uri.EscapeDataString(TwitterUrl) + "&" + Uri.EscapeDataString(SigBaseStringParams);
    IBuffer KeyMaterial = CryptographicBuffer.ConvertStringToBinary(TwitterClientSecret + "&", BinaryStringEncoding.Utf8);
    MacAlgorithmProvider HmacSha1Provider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");
    CryptographicKey MacKey = HmacSha1Provider.CreateKey(KeyMaterial);
    IBuffer DataToBeSigned = CryptographicBuffer.ConvertStringToBinary(SigBaseString, BinaryStringEncoding.Utf8);
    IBuffer SignatureBuffer = CryptographicEngine.Sign(MacKey, DataToBeSigned);
    String Signature = CryptographicBuffer.EncodeToBase64String(SignatureBuffer);
    String DataToPost = "OAuth oauth_callback='"" + Uri.EscapeDataString(TwitterCallbackUrl) + "'", oauth_consumer_key='"" + TwitterClientID + "'", oauth_nonce='"" + Nonce.ToString() + "'", oauth_signature_method='"HMAC-SHA1'", oauth_timestamp='"" + Math.Round(SinceEpoch.TotalSeconds) + "'", oauth_version='"1.0'", oauth_signature='"" + Uri.EscapeDataString(Signature) + "'"";
    var m_PostResponse = await PostData(TwitterUrl, DataToPost, false);
    if (m_PostResponse != null)
    {
        String[] keyValPairs = m_PostResponse.Split('&');
        for (int i = 0; i < keyValPairs.Length; i++)
        {
            String[] splits = keyValPairs[i].Split('=');
            switch (splits[0])
            {
                case "oauth_token":
                    Oauth_token = splits[1];
                    break;
                case "oauth_token_secret":
                    Oauth_token_secret = splits[1];
                    break;
            }
        }
        if (Oauth_token != null)
        {
            TwitterUrl = "https://api.twitter.com/oauth/authorize?oauth_token=" + Oauth_token;
            System.Uri StartUri = new Uri(TwitterUrl);
            System.Uri EndUri = new Uri(TwitterCallbackUrl);

            WebAuthenticationResult WebAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
                                                    WebAuthenticationOptions.None,
                                                    StartUri,
                                                    EndUri);
            if (WebAuthenticationResult.ResponseStatus == WebAuthenticationStatus.Success)
            {
                var text = WebAuthenticationResult.ResponseData.Split(new char[] { '?' })[1];
                var dict = text.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(part => part.Split('='))
                    .ToDictionary(split => split[0], split => split[1]);
                //Oauth_token = dict["oauth_token"];
                //Oauth_token_secret = dict["oauth_verifier"];
                await PostTweet();
            }
            else if (WebAuthenticationResult.ResponseStatus == WebAuthenticationStatus.ErrorHttp)
            {
            }
            else
            {
            }
        }
    }
}
private async Task<String> PostData(String Url, String Data, bool flag)
{
    string m_PostResponse = null;
    try
    {
        HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(Url);
        Request.Method = "POST";
        if (flag)
        {
            Request.ContentType = "application/x-www-form-urlencoded"; 
        }
        Request.Headers["Authorization"] = Data;
        if (flag)
        {
            using (Stream stream = await Request.GetRequestStreamAsync())
            {
                var postBody = "status=" + Uri.EscapeDataString(TweetFromAPI);
                byte[] content = System.Text.Encoding.UTF8.GetBytes(postBody);
                stream.Write(content, 0, content.Length);
            } 
        }
        HttpWebResponse Response = (HttpWebResponse)await Request.GetResponseAsync();
        StreamReader ResponseDataStream = new StreamReader(Response.GetResponseStream());
        m_PostResponse = await ResponseDataStream.ReadToEndAsync();
    }
    catch (Exception)
    {
        throw;
    }
    return m_PostResponse;
}
public async Task PostTweet()
{
    Random Rand = new Random();
    Int32 Nonce = Rand.Next(1000000000);
    string status = TweetFromAPI;
    string postBody = "status=" + Uri.EscapeDataString(status);
    string oauth_consumer_key = TwitterClientID;
    string oauth_consumerSecret = TwitterClientSecret;
    string oauth_signature_method = "HMAC-SHA1";
    string oauth_version = "1.0";
    string oauth_token = Oauth_token;
    string oauth_token_secret = Oauth_token_secret;
    string oauth_nonce = Nonce.ToString();
    TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
    string oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();
    SortedDictionary<string, string> basestringParameters = new SortedDictionary<string, string>();
    basestringParameters.Add("status", Uri.EscapeDataString(status));
    basestringParameters.Add("oauth_version", oauth_version);
    basestringParameters.Add("oauth_consumer_key", oauth_consumer_key);
    basestringParameters.Add("oauth_nonce", oauth_nonce);
    basestringParameters.Add("oauth_signature_method", oauth_signature_method);
    basestringParameters.Add("oauth_timestamp", oauth_timestamp);
    basestringParameters.Add("oauth_token", oauth_token);
    //Build the signature string
    string baseString = String.Empty;
    baseString += "POST" + "&";
    baseString += Uri.EscapeDataString("https://api.twitter.com/1.1/statuses/update.json") + "&";
    foreach (KeyValuePair<string, string> entry in basestringParameters)
    {
        baseString += Uri.EscapeDataString(entry.Key + "=" + entry.Value + "&");
    }
    baseString = baseString.Substring(0, baseString.Length - 3);
    //Build the signing key    
    string signingKey = Uri.EscapeDataString(oauth_consumerSecret) +
        "&" + Uri.EscapeDataString(oauth_token_secret);
    IBuffer KeyMaterial = CryptographicBuffer.ConvertStringToBinary(TwitterClientSecret + "&", BinaryStringEncoding.Utf8);
    MacAlgorithmProvider HmacSha1Provider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");
    CryptographicKey MacKey = HmacSha1Provider.CreateKey(KeyMaterial);
    IBuffer DataToBeSigned = CryptographicBuffer.ConvertStringToBinary(signingKey, BinaryStringEncoding.Utf8);
    IBuffer SignatureBuffer = CryptographicEngine.Sign(MacKey, DataToBeSigned);
    String signatureString = CryptographicBuffer.EncodeToBase64String(SignatureBuffer);
    string authorizationHeaderParams = String.Empty;
    authorizationHeaderParams += "OAuth ";
    authorizationHeaderParams += "oauth_nonce=" + "'"" +
        Nonce.ToString() + "'",";
    authorizationHeaderParams += "oauth_signature_method=" +
        "'"" + Uri.EscapeDataString(oauth_signature_method) + "'",";
    authorizationHeaderParams += "oauth_timestamp=" + "'"" +
        Uri.EscapeDataString(oauth_timestamp) + "'",";
    authorizationHeaderParams += "oauth_consumer_key=" + "'"" +
        Uri.EscapeDataString(oauth_consumer_key) + "'",";
    authorizationHeaderParams += "oauth_token=" + "'"" +
        Uri.EscapeDataString(oauth_token) + "'",";
    authorizationHeaderParams += "oauth_signature=" + "'"" +
        Uri.EscapeDataString(signatureString) + "'",";
    authorizationHeaderParams += "oauth_version=" + "'"" +
        Uri.EscapeDataString(oauth_version) + "'"";
    var respo = await PostData("https://api.twitter.com/1.1/statuses/update.json", authorizationHeaderParams, true);
}

401未经授权(webeexception),同时从通用应用程序在Twitter上发布状态

你在哪里找到你的回调URL http://f.com ?

连接到foursquare,我使用类似

的东西
var oWebBroker = Windows.Security.Authentification.Web.WebAuthenticationBroker;
var endURI = oWebBroker.getCurrentApplicationCallbackUri().absoluteUri;
...
oWebBroker.authenticateAndContinue(startURI, endURI);
然后,提供的endURI类似于ms-app://s-1-15-2-26…33520119519/ 克利斯朵夫