calDAV“PROPFIND”调用来自 calendar.yahoo.com 服务器的“401 Unauthorized”响应

问题描述

我正在尝试向 yahoo calendars(caldav) 发送获取“当前用户委托人”的请求,但作为回应,我收到了“401 未经授权”错误。在此请求之前,我正在发出另一个请求以获取“OPTIONS”,该请求给出“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("\r\n",$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."\r\n\r\n".$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" );


Link to library


以下请求给出在上述请求之前运行的“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


我也尝试过简化密码,但也没有用

解决方法

我找到了解决方案。 我在服务器调用中使用了传统密码,但实际上我必须使用您可以从中创建的“APP密码” 您的雅虎帐户在“帐户安全”标签下。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...