{"id":15706108,"url":"https://github.com/belgattitude/soluble-wallit","last_synced_at":"2025-03-30T15:46:19.929Z","repository":{"id":57055370,"uuid":"90562943","full_name":"belgattitude/soluble-wallit","owner":"belgattitude","description":"PSR-15 JWT Middleware","archived":false,"fork":false,"pushed_at":"2018-10-26T15:02:18.000Z","size":150,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-05T17:28:02.650Z","etag":null,"topics":["expressive","jwt","psr-15","psr-7"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/belgattitude.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-07T21:28:00.000Z","updated_at":"2018-10-26T15:01:21.000Z","dependencies_parsed_at":"2022-08-24T14:00:18.955Z","dependency_job_id":null,"html_url":"https://github.com/belgattitude/soluble-wallit","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belgattitude%2Fsoluble-wallit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belgattitude%2Fsoluble-wallit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belgattitude%2Fsoluble-wallit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belgattitude%2Fsoluble-wallit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/belgattitude","download_url":"https://codeload.github.com/belgattitude/soluble-wallit/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246342824,"owners_count":20761939,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["expressive","jwt","psr-15","psr-7"],"created_at":"2024-10-03T20:21:33.186Z","updated_at":"2025-03-30T15:46:19.901Z","avatar_url":"https://github.com/belgattitude.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# soluble-wallit  \n\n[![PHP Version](http://img.shields.io/badge/php-7.1+-ff69b4.svg)](https://packagist.org/packages/soluble/wallit)\n[![Build Status](https://travis-ci.org/belgattitude/soluble-wallit.svg?branch=master)](https://travis-ci.org/belgattitude/soluble-wallit)\n[![codecov](https://codecov.io/gh/belgattitude/soluble-wallit/branch/master/graph/badge.svg)](https://codecov.io/gh/belgattitude/soluble-wallit)\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/belgattitude/soluble-wallit/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/belgattitude/soluble-wallit/?branch=master)\n[![Latest Stable Version](https://poser.pugx.org/soluble/wallit/v/stable.svg)](https://packagist.org/packages/soluble/wallit)\n[![Total Downloads](https://poser.pugx.org/soluble/wallit/downloads.png)](https://packagist.org/packages/soluble/wallit)\n[![License](https://poser.pugx.org/soluble/wallit/license.png)](https://packagist.org/packages/soluble/wallit)\n\nPSR-15 Middleware for dealing with JWT generation and checks.  \n\nStatus: **Experimental**. Not yet used in production, if interested take a look at the issues\nand feel welcome to make suggestions or open P/R :) \n\n## Requirements\n\n* PHP 7.1  \n\n## Recommended \n\n* [zend-expressive 3.0](https://github.com/zendframework/zend-expressive) (or any PSR-7 \u0026 PSR-15 compatible framework)\n\n\u003e For zend-expressive 2.0 use the 0.3 release.\n\n## Install\n\n```bash\n$ composer require soluble-wallit\n```\n\n## Configure\n\nCopy [soluble-wallit.config.php.dist](https://github.com/belgattitude/soluble-wallit/blob/master/config/soluble-wallit.config.php.dist) in your autoload directory.\n\n```bash\ncp ./vendor/soluble/wallit/config/soluble-wallit.config.php.dist ./config/autoload/soluble-wallit.config.local.php\n```\n\nEdit the config file and add your token keys \n\n## Register (zend-expressive 3.0)\n\nEnsure `Soluble\\Wallit\\Config\\ConfigProvider::class` is registered in the `./config/config.php` file. \n\n```php\n\u003c?php\nuse Zend\\ConfigAggregator\\ArrayProvider;\nuse Zend\\ConfigAggregator\\ConfigAggregator;\nuse Zend\\ConfigAggregator\\PhpFileProvider;\n\n$cacheConfig = [\n    'config_cache_path' =\u003e 'data/config-cache.php',\n];\n\n$aggregator = new ConfigAggregator([\n    new ArrayProvider($cacheConfig),\n    \n    // Register the Soluble Wallit ConfigProvider    \n    Soluble\\Wallit\\Config\\ConfigProvider::class,\n    \n    new PhpFileProvider('config/autoload/{{,*.}global,{,*.}local}.php'),\n    new PhpFileProvider('config/development.config.php'),\n], $cacheConfig['config_cache_path']);\n\nreturn $aggregator-\u003egetMergedConfig();\n``` \n\n## Usage (zend-expressive 3.0)\n\nTo quickly browse the examples, see the [smoke tests directory](https://github.com/belgattitude/soluble-wallit/tree/master/tests/server/expressive/src/App/Handler). \n\n### Example 1\n\nCreate a PSR-15 handler to generate a JWT token upon successful authentication:\n\n```php\n\u003c?php declare(strict_types=1);\n\nnamespace App\\Handler;\n\nuse Psr\\Http\\Message\\{ResponseInterface, ServerRequestInterface};\nuse Psr\\Http\\Server\\RequestHandlerInterface;\nuse Fig\\Http\\Message\\StatusCodeInterface;\nuse Ramsey\\Uuid\\Uuid;\nuse Soluble\\Wallit\\Service\\JwtService;\nuse Soluble\\Wallit\\Token\\Jwt\\JwtClaims;\nuse Zend\\Diactoros\\Response\\JsonResponse;\n\nclass AuthHandler implements RequestHandlerInterface\n{\n    /**\n     * @var JwtService\n     */\n    protected $jwtService;\n\n    public function __construct(JwtService $jwtService)\n    {\n        $this-\u003ejwtService = $jwtService;\n    }\n\n    public function handle(ServerRequestInterface $request): ResponseInterface\n    {\n        $method = $request-\u003egetMethod();\n        if ($method !== 'POST') {\n            throw new \\RuntimeException('TODO - Handle error your way ;)');\n        }\n\n        $body = $request-\u003egetParsedBody();\n        $login = $body['login'] ?? '';\n        $password = $body['password'] ?? '';\n\n        if ($login === 'demo' \u0026\u0026 $password === 'demo') {\n            $token = $this-\u003ejwtService-\u003ecreateToken([\n                JwtClaims::ID =\u003e Uuid::uuid1(),\n                'login'       =\u003e $login\n            ]);\n\n            return new JsonResponse([\n                'access_token' =\u003e (string) $token,\n                'token_type'   =\u003e 'example',\n            ]);\n        }\n\n        return (new JsonResponse([\n            'success' =\u003e false\n        ]))-\u003ewithStatus(StatusCodeInterface::STATUS_UNAUTHORIZED);\n    }\n}\n\n```\n\nIts related factory can be:\n\n```php\n\u003c?php declare(strict_types=1);\n\nnamespace App\\Handler;\n\nuse Psr\\Container\\ContainerInterface;\nuse Soluble\\Wallit\\Service\\JwtService;\n\nclass AuthHandlerFactory\n{\n    public function __invoke(ContainerInterface $container): AuthHandler\n    {\n        return new AuthHandler(\n            $container-\u003eget(JwtService::class)\n        );\n    }\n}\n```\n\nAdd a route in `./config/routes.php` \n\n```php\n\u003c?php\n//....\n$app-\u003epost('/auth', App\\Handler\\AuthHandler::class, 'auth');\n```\n  \n### Example 2: Check JWT\n\nSimply pipe or add the `JwtAuthMiddleware::class` to the desired route. \n\nAs an example in the `./config/routes.php` file :\n\n```php\n\u003c?php declare(strict_types=1);\n\nuse Soluble\\Wallit\\Middleware\\JwtAuthMiddleware;\n\n// ...\n    $app-\u003eget('/admin', [\n        JwtAuthMiddleware::class,\n        App\\Handler\\AdminHandler::class\n    ], 'admin');\n\n```\n\n### Example 3: Retrive the token\n\nThe token is available as a request attribute: `$request-\u003egetAttribute(JwtAuthMiddleware::class)`.\n\n```php\n\u003c?php declare(strict_types=1);\nnamespace App\\Handler;\n\nuse Psr\\Http\\Message\\{ResponseInterface, ServerRequestInterface};\nuse Psr\\Http\\Server\\RequestHandlerInterface;\nuse Soluble\\Wallit\\Middleware\\JwtAuthMiddleware;\nuse Zend\\Diactoros\\Response\\HtmlResponse;\nuse Zend\\Expressive\\Template\\TemplateRendererInterface;\nuse Lcobucci\\JWT\\Token;\n\nclass AdminHandler implements RequestHandlerInterface\n{\n    /**\n     * @var TemplateRendererInterface\n     */\n    private $template;\n    public function __construct(TemplateRendererInterface $template) {\n        $this-\u003etemplate = $template;\n    }\n    public function handle(ServerRequestInterface $request): ResponseInterface\n    {\n        $token = $this-\u003egetTokenFromRequest($request);\n        return new HtmlResponse($this-\u003etemplate-\u003erender('pages::admin', [\n            'token' =\u003e $token,\n            'login' =\u003e $token-\u003egetClaim('login')\n        ]));\n    }    \n    protected function getTokenFromRequest(ServerRequestInterface $request): Token\n    {\n        return $request-\u003egetAttribute(JwtAuthMiddleware::class);\n    }\n}\n```\n  \n## Standards\n\n* [fig/http-message-util](https://github.com/php-fig/http-message-util) Utility classes and constants for use with PSR-7 (psr/http-message)\n* [psr/http-message](http://www.php-fig.org/psr/psr-7/) Common interface for HTTP messages (PHP FIG PSR-7)\n* [psr/container](http://www.php-fig.org/psr/psr-11/) Common Container Interface (PHP FIG PSR-11)\n* [PSR 4 Autoloader](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md)\n* [PSR 2 Coding Style Guide](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbelgattitude%2Fsoluble-wallit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbelgattitude%2Fsoluble-wallit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbelgattitude%2Fsoluble-wallit/lists"}