我会尝试解释这个问题,我不知道它是否可行......
如果您在此登录(第一个链接):
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部分:
我做错了什么?为什么登录不起作用?如何调试不起作用的内容?
答案 0 :(得分:0)
问题可能是当您使用代码$firstlogin = curl_exec($ch);
点击第一个网址时。它本质上并不意味着您现在已经登录了每个请求。在向您发送数据之前,下一个网址需要知道您是谁,并且他们可能正在使用Cookie进行此识别。尝试在浏览器中模拟它。可能是,对于第一个URL请求,登录后返回了一些 cookie ,然后在下一个请求时转发。
您还需要使用卷曲复制Cookie。尝试使用this link.
中的代码提取使用登录cURL 设置的任何 Cookie然后使用curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: test=cookie"));
如果上述方法不起作用,请尝试在浏览器中复制相同的scenerio并找出浏览器中的所有Cookie。然后复制已设置的cookie和登录cURL请求设置的cookie。这应该可行。
答案 1 :(得分:0)
你犯了很多错误,
你没有urlencode $username
,但你需要。你没有urlencode $password
,但你需要。你没有urlencode $event
,但你需要。在发送登录请求之前,您不使用或尝试获取csrf令牌(称为execution
),这将无效。如果没有预先存在的cookie会话尝试登录,那将无法正常工作,cookie会话和csrf令牌绑定在一起,如果其中一个丢失/不正确,您的登录将无法成功,并且您的代码将获取他们都不是。您还遗漏了很多登录信息参数,包括phoneNumber
,passwordForPhone
,_rememberMe
和其他几个参数,将它们全部添加。