>  기사  >  백엔드 개발  >  Curl은 OAuth 인증 사용자 센터에 대한 로그인을 어떻게 시뮬레이션하여 그 아래의 각 하위 사이트에 로그인합니까?

Curl은 OAuth 인증 사용자 센터에 대한 로그인을 어떻게 시뮬레이션하여 그 아래의 각 하위 사이트에 로그인합니까?

WBOY
WBOY원래의
2016-12-01 00:56:221395검색

문제 개요:
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일 뿐입니다. -사이트.

답변 감사합니다~~

물론 달성될 수 있습니다. 귀하의 이해가 맞습니다. 쿠키에는 고유한 토큰이 저장되며, 로그인에 성공할 때마다 토큰을 운반해야 합니다. 토큰은 즉시 무효화됩니다.

과정대로 보면 맞아야죠

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.