我正在为auth创建中间件到REST API。我的API是使用Slim PHP Framework创建的,以便提供构建API的强大功能。其中一个功能是中间件 我需要检查Middleware中的凭据并向用户回复错误(带有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-&gt; 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;
}
}
对于我的需求很适合,同样抛出异常可能是另一种解决方案,但在我的情况下,我不需要继续,只需设置标题,代码并且不要打电话给我 - 对我有用。 / p>
答案 0 :(得分:4)
您不能在中间件中使用halt
:
https://stackoverflow.com/a/10201595/2970321
只应在路由回调的上下文中调用Halt。
相反,您可以使用PHP的400
和header
手动生成exit
响应:
header("HTTP/1.1 400 Access denied");
exit;
你可以定义一种新的异常类型:
class AuthException extends Exception {
public function __construct() {
$message = 'You must authenticate to access this resource.';
$code = 400;
}
}
在error
路线中抓住这个:
$app->error(function (\Exception $e) use ($app) {
// Example of handling Auth Exceptions
if ($e instanceof AuthException) {
$app->response->setStatus($e->getCode());
$app->response->setBody($e->getMessage());
}
});
在拒绝授权时抛出AuthException
:
throw new AuthException();
这基本上是在Slim-Auth中完成的。