問題概述:
透過php curl模擬登陸一個網站如http://www.aaa.com,透過fiddler抓包分析如下:
1、表單以POST方式提交到http://www.aaa.com /dologin,這裡產生了一個token:xxx,
2、伺服器帶著這個token跳到了以下位址來登陸:https://account.usercenter.com/login?token=xxx&target_url=http://www .aaa.com
;
(注意網域不同,而且是https,此外這個攜帶token的url拷貝到任何電腦都能正常登陸,登陸成功後就會失效)
3、登陸成功後地址重定向到target_url: http://www.aaa.com
問題分析:
我的理解:有一台授權伺服器,任何一台PC電腦存取攜帶有效token的url,PC和伺服器之間透過cookie來維持這個token;
提出問題:
使用php curl該如何實現這個登陸模擬?
以下是我的程式碼:
<code><?php $cookie_file = 'E:\work\cookie.txt'; $login_url = 'http://www.aaa.com/dologin'; $post_fields = 'userName=aa&password=bb&service_key=cc' $post_fields.= '&callback_url=http%3A%2F%2Fwww.aaa.com&hostUrl=http%3A%2F%2Fwww.aaa.com'; $ch = curl_init($login_url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); $contents=curl_exec($ch); curl_close($ch); preg_match('/(https:\/\/account\.usercenter\.com\/tokenLogin[^\s]*)\s*/',$contents,$match); //var_dump($match);die; 此处匹配出携带token的url $ch = curl_init($match[1]); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36 OPR/41.0.2353.46"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $result = curl_exec($ch); curl_close($ch); $url='http://www.aaa.com/1.html'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); //curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36 OPR/41.0.2353.46"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $contents = curl_exec($ch); curl_close($ch); var_dump($contents);//这里输出的页面显示没有登陆成功(这里是问题所在) ?></code>
不知透過cookie能不能實現這種登陸?各位大俠請指點~~
問題概述:
透過php curl模擬登陸一個網站如http://www.aaa.com,透過fiddler抓包分析如下:
1、表單以POST方式提交到http://www.aaa.com /dologin,這裡產生了一個token:xxx,
2、伺服器帶著這個token跳到了以下位址來登陸:https://account.usercenter.com/login?token=xxx&target_url=http://www .aaa.com
;
(注意網域不同,而且是https,此外這個攜帶token的url拷貝到任何電腦都能正常登陸,登陸成功後就會失效)
3、登陸成功後地址重定向到target_url: http://www.aaa.com
問題分析:
我的理解:有一台授權伺服器,任何一台PC電腦存取攜帶有效token的url,PC和伺服器之間透過cookie來維持這個token;
提出問題:
使用php curl該如何實現這個登陸模擬?
以下是我的程式碼:
<code><?php $cookie_file = 'E:\work\cookie.txt'; $login_url = 'http://www.aaa.com/dologin'; $post_fields = 'userName=aa&password=bb&service_key=cc' $post_fields.= '&callback_url=http%3A%2F%2Fwww.aaa.com&hostUrl=http%3A%2F%2Fwww.aaa.com'; $ch = curl_init($login_url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); $contents=curl_exec($ch); curl_close($ch); preg_match('/(https:\/\/account\.usercenter\.com\/tokenLogin[^\s]*)\s*/',$contents,$match); //var_dump($match);die; 此处匹配出携带token的url $ch = curl_init($match[1]); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36 OPR/41.0.2353.46"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $result = curl_exec($ch); curl_close($ch); $url='http://www.aaa.com/1.html'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); //curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36 OPR/41.0.2353.46"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $contents = curl_exec($ch); curl_close($ch); var_dump($contents);//这里输出的页面显示没有登陆成功(这里是问题所在) ?></code>
不知透過cookie能不能實現這種登陸?各位大俠請指點~~
之前的程式碼我是多次調試如何攜帶cookie,不過應該是始終沒有成功關聯上cookie文件,不知道程式碼方面如何寫攜帶cookie的程式碼。不過後來經過更多次調試後,發現http://www.aaa.com/dologin呼叫後,已經可以登陸本站,這個帶有token的url只是一個sso,為了登陸其它子站。
感謝各位的解答~~
當然可以實現啊,你的理解沒錯。 cookie中保存唯一的token,每次提交的時候都要攜帶token,登入成功後,token立即失效。
按流程有 肯定就是對的