Rumah > pembangunan bahagian belakang > tutorial php > curl 如何模拟登陆一个OAuth授权用户中心从而实现登陆其下面的各个子站?

curl 如何模拟登陆一个OAuth授权用户中心从而实现登陆其下面的各个子站?

WBOY
Lepaskan: 2023-03-01 20:58:01
asal
1439 orang telah melayarinya

问题概述:
通过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>
Salin selepas log masuk
Salin selepas log masuk

不知通过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>
Salin selepas log masuk
Salin selepas log masuk

不知通过cookie能不能实现这种登陆?各位大侠请指点~~

之前的代码我是多次调试了如何携带cookie,不过应该是始终没有成功关联上cookie文件,不知道代码方面如何写携带cookie的代码。不过后来经过更多次调试后,发现http://www.aaa.com/dologin调用后,已经可以登陆本站,这个带有token的url只是一个sso,为了登陆其它子站。

感谢各位的解答~~

当然可以实现啊,你的理解没错。cookie中保存唯一的token,每次提交的时候都要携带token,登录成功后,token立即失效。

按流程有 肯定就是对的

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan