我正在为REST API创建用于身份验证的中间件。我的API是使用Slim PHP框架创建的,以防提供构建API的强大功能。这些功能之一是中间件。我需要检查中间件中的凭据,并向用户返回错误(带有JSON描述的HTTP代码)。但是不幸的是,每当我尝试停止并使用HTTP代码进行响应时,Slim Framework都会给我一个异常。
<?php
require_once __DIR__.'/../Slim/Middleware.php';
class TokenAuth extends \Slim\Middleware {
private $auth;
const SECURED_URI_REGEX = "/^\/v\d\/store\/(orders|users|payment).*/";
const TOKEN_PARAMETER = "token";
const USER_EMAIL_PARAMETER = "user_email";
public static $credentialsArray = array(TokenAuth::TOKEN_PARAMETER,TokenAuth::USER_EMAIL_PARAMETER);
public function __construct() {
}
public function deny_access() {
print Response::respondWithHttpStatus($app,401,true);
}
public function call() {
$app = $this->app;
$uri = $app->request->getResourceUri();
if (preg_match(TokenAuth::SECURED_URI_REGEX, $uri)) {
$tokenAuth = $app->request->headers->get('Authorization');
if(isset($tokenAuth)) {
$parsedCredentials = TokenAuth::parseAndValidateCredentials($tokenAuth);
if (!$parsedCredentials) {
Response::respondWithHttpStatus($app,401,true);
}
else {
$auth = new Authenticator($parsedCredentials[TokenAuth::USER_EMAIL_PARAMETER],$app);
print $auth->userHasToken();
}
}
else {
Response::respondWithHttpStatus($app,400,true);
}
}
else {
$this->next->call();
}
}
respondWithHttpStatus方法使用苗条的框架方法$ app-> halt($ code,$ response);
在这种情况下,当我尝试执行此方法时,我从]中获得异常。
Slim Framework The application could not run because of the following error: Details Type: Slim\Exception\Stop File: /var/www/api/Slim/Slim.php Line: 1022
如何处理此问题。我的目标是控制中间件中的用户凭据,如果出现问题,请使用适当的HTTP代码和描述错误原因的JSON消息进行响应。也许最好走另一条路。请提出建议。
一个可能的解决方法
$app->response->setStatus(400); $app->response->headers->set('Content-Type', 'application/json'); print Response::respondWithHttpStatus($app,400,false);
和响应功能
public static function basicRespond($app,$code,$message,$halt) { if(!isset($message) || empty($message)) { $message = Response::$RESPONSE_MAP[$code]; } $response = json_encode($message); if($halt===true) { $app->halt($code, $response); } else { return $response; } }
为了我的需求很合适,也可以抛出异常是另一种解决方案,但就我而言,我不需要继续,只需设置标题,代码并且不调用next-对我来说就可以。
我正在为REST API创建用于身份验证的中间件。我的API是使用Slim PHP框架创建的,以防提供构建API的强大功能。这些功能之一是中间件。我需要检查...
您不能在中间件中使用halt
: