3

继续:在没有 3rd 方库的情况下设置 Twitter OAuth

感谢 Nylander 先生的帮助,我设法让我的 oAuth 课程正常工作(尽管只是在很长一段时间后)!但是,我对 oAuth 流程的一些方面感到困惑。

以下是我制作的程序中发生的情况的细分:

==编辑,我想我会发布部分代码,对我来说很难用文字来解释==

//1st code segment
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth/request_token");
string response = "";
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
{
response = reader.ReadToEnd();
}

至此,我可以成功得到响应。

响应 --> oauth_token=asjndiqufh9uf&oauth_token_secret=oinroiqurhwunwer&oauth_callback_confirmed=true

//2nd code segment
Process proc = new Process();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = "https://api.twitter.com/oauth/authenticate?" + response;
proc.Start();

这将用户(我)带到一个页面,我必须选择是否要授权它。如果我同意,我将被带到一个包含 PIN 码的页面。

//3rd code segment
Console.WriteLine("Enter the PIN");
string pin = Console.ReadLine();
baseString = generateBaseString("POST", "https://api.twitter.com/oauth/access_token", oauth_token);
oauth_signature = generateSignature(baseString, oauth_token_secret);

HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth/access_token");
request2.Method = "POST";
request2.Headers["Authorization"] = generateAuthorizationHeader(oauth_token);
string response2 = "";
HttpWebResponse resp2 = (HttpWebResponse)request2.GetResponse();
using (StreamReader reader = new StreamReader(resp2.GetResponseStream()))
{
response2 = reader.ReadToEnd();
}
        Console.WriteLine(response2);

    }

此处的代码只是请求将 PIN 输入到应用程序中,然后在response2中返回最终的 oauth_token 和 oauth_token_secret,以获得一个完全正常工作的 oAuth 应用程序。(tl;dr - 此时,应用程序已经拥有它需要的所有令牌)

- 如果我在第二个代码段期间没有登录,无论我是否输入 PIN,我都会收到 401 Unauthorized 错误,我猜这是预期的。

- 如果我在第二个代码段期间登录并被定向到 PIN 页面,但随后选择不输入 PIN/在我的应用程序中输入错误的 PIN,我仍然可以成功通过身份验证,并且可以在没有任何信息的情况下获得最终令牌问题。为什么?

- 我是在做 3-legged oAuth 还是 OOB oAuth?

- 那我为什么需要 PIN 码?

- 我应该如何正确使用 PIN 码(如果需要)?

- 我应该如何在没有 PIN 的情况下进行身份验证(如果我不需要它)?

-如何让用户在认证一次后不会总是看到 PIN 页面?我可以在第一个请求中放置一个回调,但是如果我不希望用户被重定向到任何页面怎么办?

4

1 回答 1

5

我是在做 3-legged oAuth 还是 OOB oAuth?

你正在做这两件事。3-legged 意味着您涉及用户,2-legged 是企业对企业或服务对服务。OOB(带外)意味着您自动触发基于 PIN 的身份验证方案。基本上,这意味着您说如果没有用户手动将其作为 PIN 输入,您将无法接收正常的 oauth_verifier 参数。

那我为什么需要 PIN 码?

您收到 PIN 码是因为您将回叫声明为 OOB。如果您设置了真正的回调,您可以改为直接将 oauth_verifier 接收到您的应用程序。

我应该如何正确使用 PIN 码(如果需要)?

您在下一步中使用它,在将请求令牌交换为访问令牌时,您在请求中将其作为 oauth_verifier 传递。

我应该如何在没有 PIN 的情况下进行身份验证(如果我不需要它)?

您需要 PIN,或者如果您使用真正的回调,则需要 oauth_verifier。它们是相同的,唯一的区别是 PIN 打印在屏幕上,因此用户可以将其复制粘贴到您的应用程序中,而 oauth_verifier 由您的应用程序自动获取。

如何使用户在验证一次后不会总是看到 PIN 页面?我可以在第一个请求中放置一个回调,但是如果我不希望用户被重定向到任何页面怎么办?

您使用一个真正的回调来拦截并使用 oauth_verifier。

- 如果我在第二个代码段期间登录并被定向到 PIN 页面,但随后选择不输入 PIN/在我的应用程序中输入错误的 PIN,我仍然可以成功通过身份验证,并且可以在没有任何信息的情况下获得最终令牌问题。为什么?

这根本不可能是真的。这一定有充分的理由,也许您的应用程序已经有一个访问令牌并且只是使用它?

于 2012-05-31T12:01:49.990 回答