delirehberi/webfinger

此软件包已被废弃且不再维护。没有建议的替代软件包。

Webfinger 实现

dev-master 2019-07-21 13:08 UTC

This package is auto-updated.

Last update: 2020-08-21 15:40:11 UTC


README

PHP 的 WebFinger RFC7033 实现。您可以在基本安装步骤之后使用您的项目。

安装

  • 将以下依赖项添加到您的项目中: composer require delirehberi/webfinger
  • 创建您的 WebFingerController 并将其路由到 /.well-known/webfinger
  • 配置您的资源。
    • acct: 请求添加用户资源。例如: acct:rik@florina.gov
    • https:// 请求添加 URL 资源。例如: https://florina.gov/news/missing-spatio-analyst
    • mailto: 请求添加用户资源。例如: mailto:rik@florina.gov

示例

  • $router 是路由对象
  • $dbh pdo 实例

首先,您需要从 \DelirehberiWebFinger\ResourceDescriptorInterface 实现您的实体。

然后,您需要编写您的转换方法。

public function transform(): \DelirehberiWebFinger\JsonRD
            {
                $data = new \DelirehberiWebFinger\JsonRD();
                $data
                    ->setSubject("acct:" . $this->getEmail());
                $data->addAlias('https://www.example.com/~' . $this->getUsername() . "/");

                $link = new \DelirehberiWebFinger\JsonRDLink();
                $link->setRel('http://webfinger.example/rel/profile-page')
                    ->setHref('https://www.example.com/~' . $this->getUsername() . "/");
                $data->addLink($link);

                $link = new \DelirehberiWebFinger\JsonRDLink();
                $link->setRel('http://webfinger.example/rel/businesscard')
                    ->setHref('https://www.example.com/~' . $this->getUsername() . "/" . $this->getVcardUrl());
                $data->addLink($link);

                $data->addProperty('http://example.com/ns/role', 'employee');
                return $data;
            }

最后一步是在您的控制器中返回您的对象。

 $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
 $router->add('/.well-known/webfinger',function(Request $req)use($dbh){
 
    $userAdapter = new \DelirehberiWebFinger\Adapter\ArrayAdapter();
    $userAdapter->add($user);
    $userAdapter->setScheme(\DelirehberiWebFinger\Constants::Account);
    $userAdapter->setFilter(function(User $user,string $query){
        if($user->getEmail()==$query){
            return true;
        }
        return false;
    });
    
    $contentAdapter = new \DelirehberiWebFinger\Adapter\SqlQueryAdapter();
    $contentAdapter->setPdoInstance($dbg);
    $contentAdapter->setQuery("select * from contents where slug=:data");
    $contentAdapter->addModifier(function($url)use($router){
        $url = parse_url($url);
        $parse = $router->match($url['path');
        return $parse['slug']??false;
    });
    $contentAdapter->setScheme(\DelirehberiWebFinger\Constants::Content);
    
    $webfinger = new \DelirehberiWebFinger\WebFinger();
    $webfinger->addResource($userAdapter);
    $webfinger->addResource($contentAdapter);
    
    $data = $webfinger->response($req->getQuery());
    if($data===null){
        //header 404
        return "";
    }
    // don't forget add content-type to your response header
    // eg:  Content-Type: application/jrd+json
    return $data->transform()->toJSON();
 });