首页 文章

过滤后的Laravel触发路径

提问于
浏览
0

我 Build 了一个过滤器,检查发送的一些密钥和ID,然后给出或不去 . 问题是Laravel中的过滤器应该返回一个字符串,而我只是想要返回一个布尔值并让它触发预期的路径 .

过滤:

Route::filter('api_checkauth', function($route)
{
  //user"ok"
    $user_id = (int) $route->getParameter('user_id');

    $sig = $route->getParameter('sig');

    $user = User::find($user_id);

    if($user) {
      //user email
      $email = $user->email;
      //user api key
      $api_key = $user->api_key;
      //recreate signature

      $_sig = hash_hmac("sha256", $email . $user_id, $api_key);

      if($_sig === $sig) {
          return Response::json(array("message"=>"Request Ok"),200);
      } else {
          return Response::json(array("message"=>"Request Bad"),400);
      }
    } else {
      return Response::json(array("message"=>"Request not authorized"),401);
    }

});

路线:

// Route group for API versioning
Route::group(array('prefix' => 'api/v1', 'before' => 'api_checkauth'), function()
{

    Route::get('/pim/{user_id}/{sig}', 'MoreOrLessController@index');
});

所以问题是,我怎样才能触发我在组中定义的路线?因为现在发生的是只打印一条消息而不是应该触发的控制器方法 .

谢谢

2 回答

  • 1

    在Laravel中,如果过滤器返回响应,则该响应被视为对请求的响应,并且不执行路由 . 因此,只有在用户未获得授权的情况下才能执行路由以返回响应 .

    if($user) {
    
      $email = $user->email;
    
      $api_key = $user->api_key;
    
      $_sig = hash_hmac("sha256", $email . $user_id, $api_key);
    
      if($_sig !== $sig) {
    
        return Response::json(array("message"=>"Request Bad"),400);
      }
    
    } else {
    
      return Response::json(array("message"=>"Request not authorized"),401);
    }
    
  • 1

    答案是您在错误的地方返回200 HTTP响应 .

    如您所述,由于if / else语句的结构,无论发生什么情况,您都将始终从过滤器获得JSON字符串响应 .

    而不是在过滤器中返回200响应,而是在MoreOrLessController @ index操作中处理它 . 因此,澄清一下,当您确认$ _sig === $ sig *时,*不会在过滤器中返回任何内容 .

    应该这样做!

相关问题