Twitter OAuth Flow – 对oob / 3-legged身份validation和一般流程感到困惑,不需要PIN?

延续自: 设置没有第三方库的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输入到应用程序中,然后在响应2中返回最终的oauth_token和oauth_token_secret,以获得完全正常运行的oAuth应用程序。 (tl; dr – 此时,应用程序已经拥有了所需的所有令牌)

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

– 如果我已经在第二个代码段登录并且已经被定向到PIN页面,但是然后选择不输入PIN /在我的应用程序中输入一些错误的PIN,我仍然可以成功通过身份validation并且可以获得最终的令牌问题。 为什么?

– 我做了3条腿的oAuth还是OOB oAuth?

– 为什么我需要PIN呢?

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

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

– 我如何制作,以便用户在validation一次后不会总是看到PIN页面? 我可以在第一个请求中放回一个回调,但是如果我不希望用户被重定向到任何页面呢?

我在做一个三条腿的oAuth还是一个OOB oAuth?

你这两个都做。 三条腿意味着您涉及一个用户,两条腿是企业对企业,或服务到服务。 OOB(带外)表示您自动触发基于PIN的身份validation方案。 基本上这意味着您说没有用户手动将其作为PIN输入,您将无法接收正常的oauth_verifier参数。

那为什么我需要PIN呢?

您获得PIN码是因为您将回调称为OOB。 如果您设置了真正的回调,则可以直接将oauth_verifier接收到您的应用程序。

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

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

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

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

如何进行此操作以便用户在validation一次后不会始终看到PIN页面? 我可以在第一个请求中放回一个回调,但是如果我不希望用户被重定向到任何页面呢?

您使用截取并使用oauth_verifier的实际回调。

– 如果我已经在第二个代码段登录并且已经被定向到PIN页面,但是然后选择不输入PIN /在我的应用程序中输入一些错误的PIN,我仍然可以成功通过身份validation并且可以获得最终的令牌问题。 为什么?

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