Twitter OAuth Flow - 对 oob/3 腿身份验证和一般流程感到困惑,不需要 PIN

本文关键字:程感 PIN 不需要 Flow OAuth oob 身份验证 Twitter | 更新日期: 2023-09-27 18:35:41

延续自:在没有第三方库的情况下设置 Twitter OAuth

多亏了

尼兰德先生的帮助,我设法让我的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();
}

到目前为止,我可以成功得到响应。

Response --> 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 输入到应用程序中,然后返回最终oauth_token并在响应 2 中oauth_token_secret,以获得完全正常工作的 oAuth 应用程序。 (tl;dr - 此时,应用程序已经拥有所需的所有令牌)

- 如果我在第二个代码段期间没有登录,无论我是否输入 PIN,我都会收到 401 未经授权的错误,我猜这是意料之中的。

-如果我在第二个代码段中登录并被定向到 PIN 页面,但随后选择不输入 PIN/在我的应用程序中输入一些错误的 PIN,我仍然可以成功进行身份验证,并且可以毫无问题地获得最终令牌。为什么?

-我是在做 3 条腿的 oAuth 还是 OOB oAuth?

-那我为什么需要密码?

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

-如果没有 PIN 码,我应该如何进行身份验证(如果我不需要它)?

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

Twitter OAuth Flow - 对 oob/3 腿身份验证和一般流程感到困惑,不需要 PIN

我是在做 3 条腿的 oAuth 还是 OOB oAuth?

你两者都在做。3 条腿意味着您涉及一个用户,两条腿意味着企业对企业,或者服务到服务。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,我仍然可以成功进行身份验证,并且可以毫无问题地获得最终令牌。为什么?

这根本不可能是真的。这必须有一个很好的理由,也许你的应用已经有一个访问令牌并只是使用它?