使用Twitter登录验证用户身份

8
我想知道是否有人知道一个使用Twitter(OAuth)进行.NET登录的有效示例。
我目前正在使用这个http://www.voiceoftech.com/swhitley/?p=681,但只有在将回调URL设置为“oob”时才能正常工作,如果我设置实际的回调URL,则会收到“401未经授权”的错误。
谢谢!
5个回答

5

我为此编写了一个OAuth管理器,因为现有的选项过于复杂。

.NET中带验证的OAuth

该类专注于OAuth,并与Twitter特别配合使用。这不是一个暴露了整个Twitter Web API表面上大量方法的类。它只是OAuth。如果你想在Twitter上更新状态,这个类不会暴露"UpdateStatus"方法。我认为,应用程序设计人员构建他们想要发送的HTTP消息是很简单的事情。换句话说,HTTP消息就是API。但是OAuth的东西可能会变得有点复杂,所以它值得拥有一个API,这就是OAuth类。

下面是请求"请求令牌"的示例代码:

var oauth = new OAuth.Manager();
oauth["consumer_key"] = MY_APP_SPECIFIC_CONSUMER_KEY;
oauth["consumer_secret"] = MY_APP_SPECIFIC_CONSUMER_SECRET;    
oauth.AcquireRequestToken(SERVICE_SPECIFIC_REQUEST_TOKEN_URL, "POST");
就是这样。在Twitter中,用于请求令牌的服务特定URL为“https://api.twitter.com/oauth/request_token”。
一旦您获得请求令牌,您会弹出Web浏览器UI,在其中用户将明确授权您的应用程序访问Twitter。您需要在应用程序第一次运行时执行此操作。使用类似以下代码的嵌入式WebBrowser控件完成此操作:
var url = SERVICE_SPECIFIC_AUTHORIZE_URL_STUB + oauth["token"];
webBrowser1.Url = new Uri(url);

对于Twitter来说,这个URL是“https://api.twitter.com/oauth/authorize?oauth_token=”,并附加了oauth_token。
通过一些HTML屏幕抓取,在Web浏览器UI中获取PIN。然后请求“访问令牌”。
oauth.AcquireAccessToken(URL_ACCESS_TOKEN,
                         "POST",
                         pin);

对于Twitter来说,该URL是“https://api.twitter.com/oauth/access_token”。
您不需要显式处理访问令牌;OAuthManager类会为您维护状态。但是,如果您想将其写入永久存储,令牌和密钥在oauth ["token"]和oauth ["token_secret"]中可用。要使用该访问令牌进行请求,请按如下方式生成authz标头:
var authzHeader = oauth.GenerateAuthzHeader(url, "POST");

...其中url是资源端点。要在Twitter上更新用户状态,可以使用"http://api.twitter.com/1/statuses/update.xml?status=Hello"。

然后将生成的字符串设置为HTTP标头Authorization,并将HTTP请求发送到URL。

在后续运行中,当您已经拥有访问令牌和密钥时,可以像这样实例化OAuth.Manager:

var oauth = new OAuth.Manager();
oauth["consumer_key"] = MY_APP_SPECIFIC_CONSUMER_KEY;
oauth["consumer_secret"] = MY_APP_SPECIFIC_CONSUMER_SECRET;
oauth["token"] = your_stored_access_token;
oauth["token_secret"] = your_stored_access_secret;

然后生成授权头,按照上述描述进行请求。
下载DLL
查看文档

干得好,谢谢。但是文档链接失效了...你知道为什么吗? - red_alert

2
我虽然晚了一步,但我已经为那些遇到同样问题的人创建了一个视频教程。像你一样,我花了很多时间来解决401错误。
视频:http://www.youtube.com/watch?v=TGEA1sgMMqU 教程:http://www.markhagan.me/Samples/Grant-Access-And-Tweet-As-Twitter-User-ASPNet 代码(如果您不想离开此页面):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Twitterizer;

namespace PostFansTwitter
{
    public partial class twconnect : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var oauth_consumer_key = "gjxG99ZA5jmJoB3FeXWJZA";
            var oauth_consumer_secret = "rsAAtEhVRrXUTNcwEecXqPyDHaOR4KjOuMkpb8g";

            if (Request["oauth_token"] == null)
            {
                OAuthTokenResponse reqToken = OAuthUtility.GetRequestToken(
                    oauth_consumer_key,
                    oauth_consumer_secret,
                    Request.Url.AbsoluteUri);

                Response.Redirect(string.Format("http://twitter.com/oauth/authorize?oauth_token={0}",
                    reqToken.Token));
            }
            else
            {
                string requestToken = Request["oauth_token"].ToString();
                string pin = Request["oauth_verifier"].ToString();

                var tokens = OAuthUtility.GetAccessToken(
                    oauth_consumer_key,
                    oauth_consumer_secret,
                    requestToken,
                    pin);

                OAuthTokens accesstoken = new OAuthTokens()
                {
                    AccessToken = tokens.Token,
                    AccessTokenSecret = tokens.TokenSecret,
                    ConsumerKey = oauth_consumer_key,
                    ConsumerSecret = oauth_consumer_secret
                };

                TwitterResponse<TwitterStatus> response = TwitterStatus.Update(
                    accesstoken,
                    "Testing!! It works (hopefully).");

                if (response.Result == RequestResult.Success)
                {
                    Response.Write("we did it!");
                }
                else
                {
                    Response.Write("it's all bad.");
                }
            }
        }
    }
}

2

我已经通过http://www.voiceoftech.com/swhitley/?p=681解决了我的问题。

我将我的应用程序保存为“浏览器”,但由于我没有指定回调URL,因此在保存时它被转换为“客户端”应用程序。


1

感谢回答,有关于如何通过Twitter进行身份验证的可用示例吗? - StackOverflower

1
我开发了一个使用简单且易于上手的 C# OAuth 库。这个项目是开源的,我还包含了一个演示应用程序,可以访问以下服务: 1. Google 2. Twitter 3. Yahoo 4. Vimeo
当然,你也可以使用其他 OAuth 提供商。你可以在这里找到文章和库: OAuth C# Library

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接