【问题标题】:How to respond in Middleware Slim PHP Framework如何在 Middleware Slim PHP Framework 中响应
【发布时间】:2015-06-15 16:54:50
【问题描述】:

我正在为 REST API 的身份验证创建中间件。我的 API 是使用 Slim PHP 框架创建的,它提供了强大的功能来构建 API。这些功能之一是中间件。
我需要检查中间件中的凭据并向用户响应错误(带有 JSON 描述的 HTTP 代码)。
但不幸的是,每当我尝试停止并使用 HTTP 代码响应时,Slim 框架都会给我一个异常。

<?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方法使用slim framework方法$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 - 对我有用。

【问题讨论】:

    标签: php rest authentication middleware slim


    【解决方案1】:

    你不能在中间件中使用halt

    https://stackoverflow.com/a/10201595/2970321

    Halt 只能在路由回调的上下文中调用。

    相反,您可以使用 PHP 的 headerexit 手动生成 400 响应:

    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 中完成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-21
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2019-09-02
      • 1970-01-01
      相关资源
      最近更新 更多