上一章节大概分享了一些获取Request token的方法跟代码。
在这一篇文章里,主要是介绍授权(authorized)Request toekn。得到request token后,就得要授权(authorized)才能访问了。同时还要得到验证码verifier,而授权地址是:https://api.linkedin.com/uas/oauth/authorize?oauth_token=6bdaf411-dc13-4c52-b013XXXXX402d82
直接在firefox上输入地址,就可以看到登陆页面了.
很显然,从表面上看只要输入EMAIL及密码正确登陆就可以得到授权了.问题肯定没有那么简单的,所以要看看它提交的到底有多少数据。
好了,随便输入一个的用户名及密码(test)提交,然后用firebug分析一下post的数据:
(注:oauth_token屏蔽了一部分,见谅)
如图,提交的数据包括URL都在上面的截图中显示出来了,其实包括email和密码(红框)
很显然,我们只要通过爬网程序提交上面相应的数据,就可以认证了。
可是,问题还是总是不觉得那么简单的, 然而,后来注意到上面有一个参数csrtfToken是每一次请求的结果都不一样的,还有别忘了一件事:cookie。
然后用firebug分析一下,到底cookie写了些什么东西。
linkedin为了保证安全,每一次请求是要检查客户端的cookie是不是跟原来发出来的一样,否认就认为这个请求会不安全,所以,我们必须把请求链接的(https://api.linkedin.com/uas/oauth/authorize?oauth_token)cookie先获取下来,然后一模一样地发回提交请求当中,才能正常提交,否则就会提交数据不成功。
可以看到cookie里面有JSESSIONID的值跟上面所提到的csrtfToken 的值是一样的,这就好办了
好了,一切明了了,我们就可以跟据它的这些参数,我们就可以做爬网程序,获取认证授权及认证码
string GenPostData( string email, string pwd, string token, string csrfToken)
{
string s = string .Format( @" email={0}&password={1}&duration=0&extra=&access=-3
&agree=true&oauth_token={2}&appId={3}&csrfToken={4}
&sourceAlias=uas-oauth-authorize " ,
email, pwd, token, string .Empty, csrfToken);
return s;
}
private string GetOauthToken()
{
CookieCollection collection = null ;
HttpWebRequest cookie_request =
(HttpWebRequest)System.Net.WebRequest.Create( " https://api.linkedin.com/uas/oauth/authorize?oauth_token= " + Token);
CookieContainer container = new CookieContainer();
cookie_request.Method = " GET " ;
cookie_request.ContentType = " application/x-www-form-urlencoded " ;
cookie_request.KeepAlive = true ;
cookie_request.CookieContainer = container;
HttpWebResponse cookie_response = (HttpWebResponse)cookie_request.GetResponse();
collection = cookie_response.Cookies;
string postData = GenPostData(Email, Pwd, this .Token,
collection[ " JSESSIONID " ].Value.Replace( " \ "" , string.Empty));
ASCIIEncoding encoding = new ASCIIEncoding();
byte [] data = encoding.GetBytes(postData);
HttpWebRequest request =
(HttpWebRequest)System.Net.WebRequest.Create( " https://www.linkedin.com/uas/oauth/authorize/submit " );
request.Method = " Post " ;
request.ContentType = " application/x-www-form-urlencoded " ;
request.ContentLength = data.Length;
request.KeepAlive = true ;
request.CookieContainer = container;
request.CookieContainer.Add(collection);
Stream newStream = request.GetRequestStream();
newStream.Write(data, 0 , data.Length);
newStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Cookies = collection;
if (response.StatusCode == HttpStatusCode.OK)
{
NameValueCollection qs = HttpUtility.ParseQueryString(response.ResponseUri.Query);
if (qs[ " oauth_token " ] != null )
{
this .Token = qs[ " oauth_token " ];
}
if (qs[ " oauth_verifier " ] != null )
{
this .Verifier = qs[ " oauth_verifier " ];
}
// StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
// string content = reader.ReadToEnd();
}
if ( ! string .IsNullOrEmpty(Verifier))
return Token;
return string .Empty;
}
授权及认证码就可以成功获取到了.
当然,前提上一章节提到的的callback的页面能正常访问,否则就会获取不到相关的token跟verifier,假如你在你的目录下有个callback.aspx的文件,你的callback的地证是http://localhost/linkedin/callback.aspx,那么你的oauth_callback地址就是http://localhost/linkedin/callback.aspx,但一定要保证本项目能正常Redirect到callback.aspx并且正常访问(callback.aspx不需要做任何事情)