Skip to content

Commit 8a424fe

Browse files
committed
fix for #982
1 parent 30a0712 commit 8a424fe

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

src/Tqdev/PhpCrudApi/Api.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
use Tqdev\PhpCrudApi\Middleware\SslRedirectMiddleware;
3939
use Tqdev\PhpCrudApi\Middleware\TextSearchMiddleware;
4040
use Tqdev\PhpCrudApi\Middleware\ValidationMiddleware;
41+
use Tqdev\PhpCrudApi\Middleware\WpAuthMiddleware;
4142
use Tqdev\PhpCrudApi\Middleware\XmlMiddleware;
4243
use Tqdev\PhpCrudApi\Middleware\XsrfMiddleware;
4344
use Tqdev\PhpCrudApi\OpenApi\OpenApiService;
@@ -94,6 +95,9 @@ public function __construct(Config $config)
9495
case 'dbAuth':
9596
new DbAuthMiddleware($router, $responder, $config, $middleware, $reflection, $db);
9697
break;
98+
case 'wpAuth':
99+
new WpAuthMiddleware($router, $responder, $config, $middleware);
100+
break;
97101
case 'reconnect':
98102
new ReconnectMiddleware($router, $responder, $config, $middleware, $reflection, $db);
99103
break;
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
3+
namespace Tqdev\PhpCrudApi\Middleware;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use Psr\Http\Server\RequestHandlerInterface;
8+
use Tqdev\PhpCrudApi\Config\Config;
9+
use Tqdev\PhpCrudApi\Controller\Responder;
10+
use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
11+
use Tqdev\PhpCrudApi\Middleware\Router\Router;
12+
use Tqdev\PhpCrudApi\Record\ErrorCode;
13+
use Tqdev\PhpCrudApi\RequestUtils;
14+
15+
class WpAuthMiddleware extends Middleware
16+
{
17+
public function __construct(Router $router, Responder $responder, Config $config, string $middleware)
18+
{
19+
parent::__construct($router, $responder, $config, $middleware);
20+
}
21+
22+
public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
23+
{
24+
define('WP_USE_THEMES', false); // Don't load theme support functionality
25+
$wpDirectory = $this->getProperty('wpDirectory', '.');
26+
require_once("$wpDirectory/wp-load.php");
27+
$path = RequestUtils::getPathSegment($request, 1);
28+
$method = $request->getMethod();
29+
if ($method == 'POST' && $path == 'login') {
30+
$body = $request->getParsedBody();
31+
$usernameFormFieldName = $this->getProperty('usernameFormField', 'username');
32+
$passwordFormFieldName = $this->getProperty('passwordFormField', 'password');
33+
$username = isset($body->$usernameFormFieldName) ? $body->$usernameFormFieldName : '';
34+
$password = isset($body->$passwordFormFieldName) ? $body->$passwordFormFieldName : '';
35+
$user = wp_signon([
36+
'user_login' => $username,
37+
'user_password' => $password,
38+
'remember' => false,
39+
]);
40+
if ($user->ID) {
41+
return $this->responder->success($user);
42+
}
43+
return $this->responder->error(ErrorCode::AUTHENTICATION_FAILED, $username);
44+
}
45+
if ($method == 'POST' && $path == 'logout') {
46+
if (is_user_logged_in()) {
47+
wp_logout();
48+
return $this->responder->success($user);
49+
}
50+
return $this->responder->error(ErrorCode::AUTHENTICATION_REQUIRED, '');
51+
}
52+
if ($method == 'GET' && $path == 'me') {
53+
if (is_user_logged_in()) {
54+
return $this->responder->success(wp_get_current_user());
55+
}
56+
return $this->responder->error(ErrorCode::AUTHENTICATION_REQUIRED, '');
57+
}
58+
if (!is_user_logged_in()) {
59+
$authenticationMode = $this->getProperty('mode', 'required');
60+
if ($authenticationMode == 'required') {
61+
return $this->responder->error(ErrorCode::AUTHENTICATION_REQUIRED, '');
62+
}
63+
}
64+
return $next->handle($request);
65+
}
66+
}

0 commit comments

Comments
 (0)