2

Laravel Route で SabreDAV-Server を作成しようとしています。次のコードは、私が試したことを示しています。

Illuminate\Routing\Router::$verbs = [
    'GET',
    'HEAD',
    'POST',
    'PUT',
    'PATCH',
    'DELETE', 
    'PROPFIND',
    'PROPPATCH',
    'MKCOL',
    'COPY',
    'MOVE',
    'LOCK',
    'UNLOCK'
];


    Route::match(['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'PATCH', 'PROPFIND', 'PROPPATCH', 'MKCOL', 'COPY', 'MOVE', 'LOCK', 'UNLOCK'], 'carddav{test}', function()
{
        date_default_timezone_set('Europe/Berlin');

        $baseUri = '/carddav';

        $pdo = new PDO('mysql:host=localhost;dbname=dav', 'root', 'root');
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

        $authBackend = new \Sabre\DAV\Auth\Backend\PDO($pdo);
        $principalBackend = new \Sabre\DAVACL\PrincipalBackend\PDO($pdo);
        $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo);

        $nodes = [
                new \Sabre\DAVACL\PrincipalCollection($principalBackend),
                new \Sabre\CardDAV\AddressBookRoot($principalBackend, $carddavBackend)
        ];

        $server = new \Sabre\DAV\Server($nodes);
        $server->setBaseUri($baseUri);

        $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'SabreDAV'));
        $server->addPlugin(new \Sabre\DAV\Browser\Plugin());
        $server->addPlugin(new \Sabre\CardDAV\Plugin());
        $server->addPlugin(new \Sabre\DAVACL\Plugin());
        $server->addPlugin(new \Sabre\DAV\Sync\Plugin());

        $server->exec();
})->where('path', '(.)*';

しかし、ブラウザでそれを呼び出そうとすると、エラーが発生します:

<?xml version="1.0" encoding="utf-8"?>
<d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
  <s:sabredav-version>2.0.4</s:sabredav-version>
  <s:exception>Sabre\DAV\Exception\NotAuthenticated</s:exception>
  <s:message>No digest authentication headers were found</s:message>
</d:error>

認証プロンプトはありませんでした。

Evolution から接続しようとすると、「メソッドが許可されていません」というメッセージが表示されました。

誰かが問題が何であるか考えていますか?

ありがとう、ペペ

4

1 に答える 1

1

問題は、送信された HTTP ステータス コードです。SabreDAV からの応答に関係なく、Laravel ルーターは常に HTTP ステータス コードを 200 に設定するため、CardDAV クライアントは要求を承認する必要があることを認識できず、基本認証チャレンジは無視されます。

私のソリューションは最も洗練されたものではないかもしれませんが、機能しています。$server->exec() を ob_start() および ob_end() タグでラップし、コンテンツを実際の Laravel レスポンスで出力するだけです。

ob_start();
$server->exec();

$status = $server->httpResponse->getStatus();
$content = ob_get_contents();
ob_end_clean();

return response($content, $status);

一般的なガイダンス:

  • 「postman」(Google Chrome アプリ)を使用してリクエストをテストします。認証ヘッダーを前もって送信すると、それらが機能していることがわかります
  • 「Charles」などの Web デバッグ プロキシを使用して、実際のリクエストとレスポンスの本文を監視します
于 2015-12-23T09:40:52.520 に答える