用cURL远程登录PHP,需要建议

时间:2018-04-12 19:36:33

标签: php curl login

我会尝试解释这个问题,我不知道它是否可行......

如果您在此登录(第一个链接):

https://profile.ea.com/

然后去这里(第二个链接):

https://accounts.ea.com/connect/auth?client_id=sparta-companion-web&response_type=code&prompt=none&redirect_uri=nucleus:rest

只有在您登录时才能找到这样的代码(令牌):

{"code":"QUORAL0aEYq2RjJGJwFEIddI99wM_FaZ_FgktceQ"}

我需要通过我的网络应用程序(使用PHP的cURL)进行一些(未记录的)API调用。 我正在尝试模仿我在执行登录时所做的事情,但它似乎每次都失败了,我无法理解为什么......

这是我第一次拨打第一个链接:

<?php

$username = urlencode('myaccount@mail.test');
$password = 'Mysecretpassword';
$event = 'submit';
$loginUrl = 'https://profile.ea.com/';

//init curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'email='.$username.'&password='.$password.'&_eventId='.$event);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$firstlogin = curl_exec($ch);
//var_dump($firstlogin);

//login done?

然后是令牌部分:

//get the token
curl_setopt($ch, CURLOPT_URL, 'https://accounts.ea.com/connect/auth?client_id=sparta-companion-web&response_type=code&prompt=none&redirect_uri=nucleus:rest');

//execute the request
$token = curl_exec($ch);

var_dump($token);die;

主要问题是第1部分:

  • profile.ea链接似乎重定向到一个唯一的URL,可能CURLOPT_FOLLOWLOCATION还不够?
  • 登录所需的数据是带有'email','password'和'_eventId'的数组,但我找不到任何其他必填字段。

我做错了什么?为什么登录不起作用?如何调试不起作用的内容?

2 个答案:

答案 0 :(得分:0)

问题可能是当您使用代码$firstlogin = curl_exec($ch);点击第一个网址时。它本质上并不意味着您现在已经登录了每个请求。在向您发送数据之前,下一个网址需要知道您是谁,并且他们可能正在使用Cookie进行此识别。尝试在浏览器中模拟它。可能是,对于第一个URL请求,登录后返回了一些 cookie ,然后在下一个请求时转发。

您还需要使用卷曲复制Cookie。尝试使用this link.

中的代码提取使用登录cURL 设置的任何 Cookie

然后使用curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: test=cookie"));

转发带有cURL请求的Cookie

如果上述方法不起作用,请尝试在浏览器中复制相同的scenerio并找出浏览器中的所有Cookie。然后复制已设置的cookie和登录cURL请求设置的cookie。这应该可行。

答案 1 :(得分:0)

你犯了很多错误,

你没有urlencode $username,但你需要。你没有urlencode $password,但你需要。你没有urlencode $event,但你需要。在发送登录请求之前,您不使用或尝试获取csrf令牌(称为execution),这将无效。如果没有预先存在的cookie会话尝试登录,那将无法正常工作,cookie会话和csrf令牌绑定在一起,如果其中一个丢失/不正确,您的登录将无法成功,并且您的代码将获取他们都不是。您还遗漏了很多登录信息参数,包括phoneNumberpasswordForPhone_rememberMe和其他几个参数,将它们全部添加。