문제 개요:
php 컬을 통해 http://www.aaa.com 같은 웹사이트에 로그인하는 것을 시뮬레이션하고, fiddler를 통해 패킷을 캡처하여 다음과 같이 분석합니다.
1. 양식이 POST 모드로 제출됩니다. http://www.aaa.com/dologin으로 이동하면 여기에서 토큰이 생성됩니다: xxx,
2. 서버는 로그인하기 위해 이 토큰을 사용하여 다음 주소로 점프합니다. https://account.usercenter.com/login?token=xxx&target_url=http://www.aaa.com
;
( 참고로 도메인 이름은 https 입니다. 또한 토큰을 담고 있는 URL을 아무 컴퓨터에나 복사하면 정상적으로 로그인이 가능합니다. 이후에는 무효화됩니다. 로그인 성공)
3. 로그인 성공 후 주소는 target_url: http://www.aaa.com
문제 분석:
내가 이해한 바: 모든 PC는 유효한 토큰을 가지고 있는 URL에 액세스합니다. 이 토큰은 PC와 서버 사이의 쿠키를 통해 유지됩니다.
질문하기: PHP 컬을 사용하여 이 로그인 시뮬레이션을 구현하는 방법은 무엇입니까?
<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>
답글 내용:
문제 개요:php 컬을 통해 http://www.aaa.com 같은 웹사이트에 로그인하는 것을 시뮬레이션하고, fiddler를 통해 패킷을 캡처하여 다음과 같이 분석합니다.
1. 양식이 POST 모드로 제출됩니다. http://www.aaa.com/dologin으로 이동하면 여기에서 토큰이 생성됩니다: xxx,
2. 서버는 로그인하기 위해 이 토큰을 사용하여 다음 주소로 점프합니다.
; https://account.usercenter.com/login?token=xxx&target_url=http://www.aaa.com
( 참고로 도메인 이름은 https 입니다. 또한 토큰을 담고 있는 URL을 아무 컴퓨터에나 복사하면 정상적으로 로그인이 가능합니다. 로그인 성공)
3. 로그인에 성공하면 주소가 target_url: http://www.aaa.com
으로 리디렉션됩니다.
문제 분석: 내가 이해한 바: 모든 PC는 유효한 토큰을 가지고 있는 URL에 액세스합니다. 이 토큰은 PC와 서버 사이의 쿠키를 통해 유지됩니다.
PHP 컬을 사용하여 이 로그인 시뮬레이션을 구현하는 방법은 무엇입니까?
내 코드는 다음과 같습니다.
쿠키를 통해서도 이런 로그인이 가능한지 궁금합니다. 영웅님들 조언 부탁드려요~~
<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>
이전 코드에서 쿠키를 운반하는 방법을 여러 번 디버깅했지만 쿠키 파일과 성공적으로 연결되지 않은 것 같습니다. 쿠키를 운반하는 코드를 작성하는 방법을 모르겠습니다. 그러나 더 많은 디버깅을 한 후에는 http://www.aaa.com/dologin을 호출한 후 이미 이 사이트에 로그인할 수 있다는 것을 발견했습니다. 토큰이 포함된 이 URL은 다른 하위에 로그인하기 위한 sso일 뿐입니다. -사이트.
답변 감사합니다~~
물론 달성될 수 있습니다. 귀하의 이해가 맞습니다. 쿠키에는 고유한 토큰이 저장되며, 로그인에 성공할 때마다 토큰을 운반해야 합니다. 토큰은 즉시 무효화됩니다.
과정대로 보면 맞아야죠