Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Garmin连接登录php_Php_Authentication_Curl - Fatal编程技术网

Garmin连接登录php

Garmin连接登录php,php,authentication,curl,Php,Authentication,Curl,尝试使用新的SSO方法对garmin connect进行身份验证,但我一直被卡住。我在这里找到了我认为在python中可以工作的方法: 到目前为止,我的代码是: $url = "https://sso.garmin.com/sso/login?service=http%3A%2F%2Fconnect.garmin.com%2Fpost-auth%2Flogin&webhost=olaxpw-connect04.garmin.com&source=http%3A%2F%2Fcon

尝试使用新的SSO方法对garmin connect进行身份验证,但我一直被卡住。我在这里找到了我认为在python中可以工作的方法:

到目前为止,我的代码是:

$url = "https://sso.garmin.com/sso/login?service=http%3A%2F%2Fconnect.garmin.com%2Fpost-auth%2Flogin&webhost=olaxpw-connect04.garmin.com&source=http%3A%2F%2Fconnect.garmin.com%2Fen-US%2Fsignin&redirectAfterAccountLoginUrl=http%3A%2F%2Fconnect.garmin.com%2Fpost-auth%2Flogin&redirectAfterAccountCreationUrl=http%3A%2F%2Fconnect.garmin.com%2Fpost-auth%2Flogin&gauthHost=https%3A%2F%2Fsso.garmin.com%2Fsso&locale=en_US&id=gauth-widget&cssUrl=https%3A%2F%2Fstatic.garmincdn.com%2Fcom.garmin.connect%2Fui%2Fcss%2Fgauth-custom-v1.0-min.css&clientId=GarminConnect&rememberMeShown=true&rememberMeChecked=false&createAccountShown=true&openCreateAccount=false&usernameShown=true&displayNameShown=false&consumeServiceTicket=false&initialFocus=true&embedWidget=false";
$page = file_get_contents($url);
//echo $page;
   $username = '********';
$password = '************';

preg_match("/flowExecutionKey:\s\[(.*)-->/",$page,$m);
$flow = trim(str_replace(']','',$m[1]));
$ch = curl_init('https://sso.garmin.com/sso/login?service=http://connect.garmin.com/post-auth/login&clientID=GarminConnect&consumeServiceTicket=false');
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_ENCODING, "gzip" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookie_file );
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie_file );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
$query = http_build_query(array('username'=>$username,'password'=>$password,'embed'=>'true','_eventID'=>'submit','lt'=>$flow));
curl_setopt($ch, CURLOPT_POSTFIELDS,$query);
$output = curl_exec($ch);
$http_status = curl_getinfo($url, CURLINFO_HTTP_CODE);
curl_close($ch);
var_dump($http_status);
var_dump($output);

我可以毫无问题地获取流执行键,但当我将其与所需字段一起发布时,我根本没有得到任何输出。

首先尝试从代码中删除这一行,然后再次运行。您正在此处再次设置上一个url。所以把它擦掉

curl_setopt( $ch, CURLOPT_URL, $url );
如果仍然不起作用:那么…

您正在使用
$page=file\u get\u contents($url)浏览登录页面
因此,此调用期间来自站点的任何cookie都不会存储在您的
$cookie\u文件中

因此,不要调用
file\u get\u contents
函数,而是使用curl和同一个cookie文件来获取html

$login = curl_init();
curl_setopt( $login, CURLOPT_URL, $url );
curl_setopt( $login, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $login, CURLOPT_ENCODING, "" );
curl_setopt( $login, CURLOPT_COOKIEFILE, $cookie_file );
curl_setopt( $login, CURLOPT_COOKIEJAR, $cookie_file );
curl_setopt( $login, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $login, CURLOPT_SSL_VERIFYPEER,false);
$page= curl_exec($login);
curl_close($login);
如果仍然不起作用,那么在第二次调用curl时添加这一行

curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER,false);

最后使用
curl\u setopt($ch,CURLOPT\u VERBOSE,true)
查看自己调试curl所做的工作。

您从未设置过
CURLOPT\u POST
,这意味着您正在执行GET。另外,您在curl_init中设置了一个url,然后在下一行将其替换为$url,这两个url是不同的。