CalDAV «PROPFIND» вызывает «401 несанкционированный» ответ от календаря.yahoo.com сервер

#php #caldav

#php #caldav

Вопрос:

Я пытаюсь отправить yahoo calendars (caldav) запрос на получение «current-user-principal», но в ответ я получаю ошибку «401 Unauthorized». Перед этим запросом я делаю еще один запрос, чтобы получить «ПАРАМЕТРЫ», который дает ответ «200 OK».

Вызов запроса является

 

    PROPFIND / HTTP/1.1
    Authorization: Basic XXXXXXXXXXXXXXXX=
    Host: calendar.yahoo.com:443
    Depth: 0
    Prefer: return-minimal
    Content-type: application/xml; charset=utf-8
    Content-Length: 85
    User-Agent: DAViCalClient
    Connection: close
    
    
        
            
        
    

  

Ответ на запрос:

 

    string(613) "HTTP/1.1 401 Unauthorized
    WSHost: tardis012.cal.bf1.yahoo.com
    Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 18-Feb-2021 03:44:03 GMT
    WWW-Authenticate: Basic realm="YahooCalendar"
    WWW-Authenticate: OAuth realm="YahooCalendar"
    Content-Length: 0
    Date: Fri, 19 Feb 2021 03:44:03 GMT
    Age: 1
    Server: ATS
    Referrer-Policy: no-referrer-when-downgrade
    Connection: close
    Strict-Transport-Security: max-age=15552000
    Expect-CT: max-age=31536000, report-uri="http://csp.yahoo.com/beacon/csp?src=yahoocom-expect-ct-report-only"
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff

  

Я использую клиентскую библиотеку, в которой есть функция для выполнения запроса сервера

 

    function DoRequest( $relative_url = "" ) {
        if(!defined("_FSOCK_TIMEOUT")){ define("_FSOCK_TIMEOUT", 10); }
        $headers = array();
    
        $headers[] = $this->requestMethod." ". $this->base_url . $relative_url . " HTTP/1.1";
        $headers[] = "Authorization: Basic ".base64_encode($this->user .":". $this->pass );
        $headers[] = "Host: ".$this->server .":".$this->port;
    
        foreach( $this->headers as $ii => $head ) {
          $headers[] = $head;
        }
        $headers[] = "Content-Length: " . strlen($this->body);
        $headers[] = "User-Agent: " . $this->user_agent;
        $headers[] = 'Connection: close';
        $this->httpRequest = join("rn",$headers);
        $this->xmlRequest = $this->body;
    
        $fip = fsockopen( $this->protocol . '://' . $this->server, $this->port, $errno, $errstr, _FSOCK_TIMEOUT); //error handling?
        if ( !(get_resource_type($fip) == 'stream') ) return false;
        if ( !fwrite($fip, $this->httpRequest."rnrn".$this->body) ) { fclose($fip); return false; }
        $rsp = "";
        while( !feof($fip) ) { $rsp .= fgets($fip,8192); }
        fclose($fip);
        
        $this->headers = array();  // reset the headers array for our next request
        $this->ParseResponse($rsp);
        return $rsp;
      }

  

Вот инициализация класса.

 

    $cal = new CalDAVClient("https://calendar.yahoo.com/", "piyush138", "XXXXXXXXXXX", "calendar" );

  

Ссылка на библиотеку


Следующий запрос выдает ответ «200 ok», который выполняется перед вышеуказанным запросом:

Запрос к серверу

 

    OPTIONS / HTTP/1.1
    Authorization: Basic cGl5dXNoMTM4OkQxZzF0YWxoZWw=
    Host: calendar.yahoo.com:443
    Content-Length: 0
    User-Agent: DAViCalClient
    Connection: close

  

Ответ от сервера

 

    string(668) "HTTP/1.1 200 OK
    WSHost: tardis030.cal.bf1.yahoo.com
    Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 18-Feb-2021 03:44:01 GMT
    DAV: 1, 3, calendar-access
    MS-Author-Via: DAV
    Allow: HEAD, MKCOL, POST, PROPFIND, ACL, COPY, REPORT, OPTIONS, PUT, DELETE, MKCALENDAR, MOVE, GET, PROPPATCH
    Content-Length: 0
    Date: Fri, 19 Feb 2021 03:44:02 GMT
    Age: 3
    Server: ATS
    Referrer-Policy: no-referrer-when-downgrade
    Connection: close
    Strict-Transport-Security: max-age=15552000
    Expect-CT: max-age=31536000, report-uri="http://csp.yahoo.com/beacon/csp?src=yahoocom-expect-ct-report-only"
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff

  

Я также попытался упростить свой пароль, но это тоже не сработало

Ответ №1:

Я нашел решение. Я использовал обычный пароль при вызове сервера, но на самом деле мне пришлось использовать «Пароль приложения», который вы можете создать из своей учетной записи Yahoo на вкладке «Безопасность учетной записи».