php - 使用 laravel 进行 REST api 身份验证

标签 php rest authentication laravel

我正在使用 RESTful Controller 属性通过 laravel 构建一个 RESTful api。到目前为止,我已经能够让它的大部分工作。现在的问题是身份验证,我正在尝试使用使用“user_id”和“签名”的亚马逊方法。 我正在使用 php 的“hash_hmac()”创建签名。

这是一个示例 api Controller

class Api_Tasks_Controller extends Api_Controller {

    public $restful = true;

    public function get_index($id = null) {

        $this->verfiy_request();

        if(!is_null($id))
        {
            return Response::json(array("tasks"=>"just one"),200);
        }
        else
        {
            return Response::json(array("tasks"=>"everthing"),200);
        }
    }


}

这是 api Controller 类

class Api_Controller extends Controller {

    public function verify_request() {

        //user id
        $user_id = (int) Input::get('user_id');
        //signature
        $sig = Input::get('sig');

        //Lookup user
        $user = Sentry::user($user_id);
        if($user) {
            //user email
            $email = $user->email;
            //user api key
            $api_key = $user->metadata['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);
        }
    }

发出获取请求 http://api.xyz.com/v1/tasks/1?user_id=1&sig=41295da38eadfa56189b041a022c6ae0fdcbcd5e65c83f0e9aa0e6fbae666cd8 始终返回一条成功消息,即使我更改了 user_id 参数的值这应该使签名无效并使请求无效。 看来我的 verfiy_request 方法没有执行。 请帮帮我

最佳答案

我最近也在研究这个,也建议使用过滤器。它可以像这样工作:

class Api_Tasks_Controller extends Base_Controller {

    public $restful = true;

    function __construct() {
        // Check if user is authorized
        $this->filter('before', 'api_checkauth');
    }

    // rest of the class ....

}

在你的 routes.php 文件中:

Route::filter('api_checkauth', function()
{
  //user id
  $user_id = (int) Input::get('user_id');

  //signature
  $sig = Input::get('sig');

  try {
    //Lookup user
    $user = Sentry::user($user_id);

    if($user) {
      //user email
      $email = $user->email;
      //user api key
      $api_key = $user->metadata['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);
    }
  }
  catch (Sentry\SentryException $e) {
    $errors = $e->getMessage(); // catch errors such as user not existing or bad fields
    return Response::json(array("message"=>$errors),404);
  }

});

另外,感谢您向我介绍 Sentry :-)

关于php - 使用 laravel 进行 REST api 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14461029/

相关文章:

javascript - 如何在javaScript中从子页面刷新父页面

php - CakePHP 中是否可以检测 MySQL 字段的字段类型?

c# - 使用 WebClient 或 HttpClient 下载文件?

javascript - 就速度而言,GraphQL API 是否比标准 RESTful API 具有更好的性能?

javascript - ReactJS - 如何设置登录模式?

使用 Jsoup 需要登录的 Java 抓取网站

php - 如何使用 PHP PDO 对象恢复存储在 PostgreSQL ByteA 中的 gz 压缩字符串?

javascript - 如何获取从 html 文件发送到 php 的数据并接收并显示数据

rest - 在 Tomcat 上使用 RESTeasy

php - 无法在自定义 Laravel 测试环境中进行身份验证(codeception)