0

我在 asp.net 中为我的网站实现 twitter 登录身份验证。

单击 Twitter 登录按钮和授权应用程序后,我收到以下错误页面:

The remote server returned an error: (410) Gone.

这是我的代码:

.ASPX Page:

<asp:ImageButton ID="imgTwitter" runat="server" ImageUrl="~/TwitterSigning.png" OnClick="imgTwitter_Click" />

.CS Page

private void GetUserDetailsFromTwitter()
{
    if (Request["oauth_token"] != null & Request["oauth_verifier"] != null)
    {
        imgTwitter.Visible = false;
        tbleTwitInfo.Visible = true;
        var oAuth = new oAuthTwitter();
        //Get the access token and secret.
        oAuth.AccessTokenGet(Request["oauth_token"], Request["oauth_verifier"]);
        if (oAuth.TokenSecret.Length > 0)
        {
            //We now have the credentials, so make a call to the Twitter API.
            url = "http://api.twitter.com/1/account/verify_credentials.xml";
            xml = oAuth.oAuthWebRequest(oAuthTwitter.Method.GET, url, String.Empty);
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.LoadXml(xml);
            XmlNodeList xmlList = xmldoc.SelectNodes("/user");
            foreach (XmlNode node in xmlList)
            {
                name = node["name"].InnerText;
                username = node["screen_name"].InnerText;
                profileImage = node["profile_image_url"].InnerText;
                followersCount = node["followers_count"].InnerText;
                noOfTweets = node["statuses_count"].InnerText;
                recentTweet = node["status"]["text"].InnerText;
            }
        }
    }
}
protected void imgTwitter_Click(object sender, ImageClickEventArgs e)
{
    var oAuth = new oAuthTwitter();
    if(!Request["oauth_token"] == null)
    {
        GetUserDetailsFromTwitter();
    }
}

AppCode/oAuthTwitter.cs

using System;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Net;
using System.Web;

namespace oAuthExample
{
public class oAuthTwitter : OAuthBase
{
    #region Method enum

    public enum Method
    {
        GET,
        POST,
        DELETE
    } ;

    #endregion

    public const string REQUEST_TOKEN = "https://api.twitter.com/oauth/request_token";
    public const string AUTHORIZE = "https://api.twitter.com/oauth/authorize";
    public const string ACCESS_TOKEN = "https://api.twitter.com/oauth/access_token";
    private string _callBackUrl = "oob"; // your app link or any other link...

    private string _consumerKey = "";
    private string _consumerSecret = "";
    private string _oauthVerifier = "";
    private string _token = "";
    private string _tokenSecret = "";

    #region Properties

    public string ConsumerKey
    {
        get
        {
            if (_consumerKey.Length == 0)
            {
                _consumerKey = ConfigurationManager.AppSettings["consumerKey"];
            }
            return _consumerKey;
        }
        set { _consumerKey = value; }
    }

    public string ConsumerSecret
    {
        get
        {
            if (_consumerSecret.Length == 0)
            {
                _consumerSecret = ConfigurationManager.AppSettings["consumerSecret"];
            }
            return _consumerSecret;
        }
        set { _consumerSecret = value; }
    }

    public string Token
    {
        get { return _token; }
        set { _token = value; }
    }

    public string TokenSecret
    {
        get { return _tokenSecret; }
        set { _tokenSecret = value; }
    }

    public string CallBackUrl
    {
        get { return _callBackUrl; }
        set { _callBackUrl = value; }
    }

    public string OAuthVerifier
    {
        get { return _oauthVerifier; }
        set { _oauthVerifier = value; }
    }

    #endregion

    /// <summary>
    /// Get the link to Twitter's authorization page for this application.
    /// </summary>
    /// <returns>The url with a valid request token, or a null string.</returns>
    public string AuthorizationLinkGet()
    {
        string ret = null;

        string response = oAuthWebRequest(Method.GET, REQUEST_TOKEN, String.Empty);
        if (response.Length > 0)
        {
            //response contains token and token secret.  We only need the token.
            NameValueCollection qs = HttpUtility.ParseQueryString(response);

            if (qs["oauth_callback_confirmed"] != null)
            {
                if (qs["oauth_callback_confirmed"] != "true")
                {
                    throw new Exception("OAuth callback not confirmed.");
                }
            }

            if (qs["oauth_token"] != null)
            {
                ret = AUTHORIZE + "?oauth_token=" + qs["oauth_token"];
            }
        }
        return ret;
    }

    /// <summary>
    /// Exchange the request token for an access token.
    /// </summary>
    /// <param name="authToken">The oauth_token is supplied by Twitter's authorization page following the callback.</param>
    /// <param name="oauthVerifier">An oauth_verifier parameter is provided to the client either in the pre-configured callback URL</param>
    public void AccessTokenGet(string authToken, string oauthVerifier)
    {
        Token = authToken;
        OAuthVerifier = oauthVerifier;

        string response = oAuthWebRequest(Method.GET, ACCESS_TOKEN, String.Empty);

        if (response.Length > 0)
        {
            //Store the Token and Token Secret
            NameValueCollection qs = HttpUtility.ParseQueryString(response);
            if (qs["oauth_token"] != null)
            {
                Token = qs["oauth_token"];
            }
            if (qs["oauth_token_secret"] != null)
            {
                TokenSecret = qs["oauth_token_secret"];
            }
        }
    }

    /// <summary>
    /// Submit a web request using oAuth.
    /// </summary>
    /// <param name="method">GET or POST</param>
    /// <param name="url">The full url, including the querystring.</param>
    /// <param name="postData">Data to post (querystring format)</param>
    /// <returns>The web server response.</returns>
    public string oAuthWebRequest(Method method, string url, string postData)
    {
        string outUrl = "";
        string querystring = "";
        string ret = "";


        //Setup postData for signing.
        //Add the postData to the querystring.
        if (method == Method.POST || method == Method.DELETE)
        {
            if (postData.Length > 0)
            {
                //Decode the parameters and re-encode using the oAuth UrlEncode method.
                NameValueCollection qs = HttpUtility.ParseQueryString(postData);
                postData = "";
                foreach (string key in qs.AllKeys)
                {
                    if (postData.Length > 0)
                    {
                        postData += "&";
                    }
                    qs[key] = HttpUtility.UrlDecode(qs[key]);
                    qs[key] = UrlEncode(qs[key]);
                    postData += key + "=" + qs[key];
                }
                if (url.IndexOf("?") > 0)
                {
                    url += "&";
                }
                else
                {
                    url += "?";
                }
                url += postData;
            }
        }

        var uri = new Uri(url);

        string nonce = GenerateNonce();
        string timeStamp = GenerateTimeStamp();

        //Generate Signature
        string sig = GenerateSignature(uri,
                                       ConsumerKey,
                                       ConsumerSecret,
                                       Token,
                                       TokenSecret,
                                       CallBackUrl,
                                       OAuthVerifier,
                                       method.ToString(),
                                       timeStamp,
                                       nonce,
                                       out outUrl,
                                       out querystring);

        querystring += "&oauth_signature=" + UrlEncode(sig);

        //Convert the querystring to postData
        if (method == Method.POST || method == Method.DELETE)
        {
            postData = querystring;
            querystring = "";
        }

        if (querystring.Length > 0)
        {
            outUrl += "?";
        }

        ret = WebRequest(method, outUrl + querystring, postData);

        return ret;
    }

    /// <summary>
    /// Web Request Wrapper
    /// </summary>
    /// <param name="method">Http Method</param>
    /// <param name="url">Full url to the web resource</param>
    /// <param name="postData">Data to post in querystring format</param>
    /// <returns>The web server response.</returns>
    public string WebRequest(Method method, string url, string postData)
    {
        HttpWebRequest webRequest = null;
        StreamWriter requestWriter = null;
        string responseData = "";

        webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
        webRequest.Method = method.ToString();
        webRequest.ServicePoint.Expect100Continue = false;
        //webRequest.UserAgent  = "Identify your application please.";
        //webRequest.Timeout = 20000;

        if (method == Method.POST || method == Method.DELETE)
        {
            webRequest.ContentType = "application/x-www-form-urlencoded";

            //POST the data.
            requestWriter = new StreamWriter(webRequest.GetRequestStream());
            try
            {
                requestWriter.Write(postData);
            }
            catch
            {
                throw;
            }
            finally
            {
                requestWriter.Close();
                requestWriter = null;
            }
        }

        responseData = WebResponseGet(webRequest);

        webRequest = null;

        return responseData;
    }

    /// <summary>
    /// Process the web response.
    /// </summary>
    /// <param name="webRequest">The request object.</param>
    /// <returns>The response data.</returns>
    public string WebResponseGet(HttpWebRequest webRequest)
    {
        StreamReader responseReader = null;
        string responseData = "";

        try
        {
            responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
            responseData = responseReader.ReadToEnd();
        }
        catch
        {
            throw;
        }
        finally
        {
            webRequest.GetResponse().GetResponseStream().Close();
            responseReader.Close();
            responseReader = null;
        }

        return responseData;
    }
}

}

我在 App_Code 文件夹中也有 oAuth.css。

任何想法如何修复 410 错误。它与已退役的 API v1.0 有关吗?如果是这样,如何在我的场景中解决它?

谢谢。

4

1 回答 1

0

您可能需要更改代码中的 URL 以使用 1.1 版本的 API,因为 1.0 版本的 API 已失效。

url = "http://api.twitter.com/1.1/account/verify_credentials.xml";
                               ^^ -- this
于 2013-09-09T14:09:57.860 回答