Rest Api的无状态身份验证

时间:2015-12-14 16:19:16

标签: php rest authentication authorization restful-authentication

为我的休息api寻找一个好的身份验证方法我来了一个:

“什么是无状态身份验证? 同样,无国籍意味着没有国家。但是,如何在服务器上没有任何状态的情况下从令牌中识别用户?令人惊讶的是,这很容易!只需将所有数据发送到客户端。 那么你将存储/发送什么(发送到客户端/网络)?最简单的例子是访问令牌。访问令牌通常具有唯一ID,到期日期以及创建它的客户端的ID。要存储它,您只需将此数据放入JSON对象,然后使用base64对其进行编码。“

现在,拥有一个自包含令牌,您需要确保没有人可以操纵数据。为此,您应使用MAC算法或任何其他可用的数字签名方法对其进行签名。

这对我来说有点混乱,如何在请求到来时验证访问令牌(没有任何存储来匹配它),但我觉得这是一个好主意,我想实现它,任何建议都会非常有帮助

我的rest api非常简单我收到index.php的每个请求,然后我用请求类创建新对象来分析请求的每个元素。

请求类看起来像这样:

<?php

class Request {

public $url_elements;
public $verb;
public $parameters;

public function __construct() {
    $this->verb = $_SERVER['REQUEST_METHOD'];
    $this->url_elements = explode('/', $_SERVER['PATH_INFO']);

    $this->parseIncomingParams();

    $this->format = 'json';
    if(isset($this->parameters['format'])) {
        $this->format = $this->parameters['format'];
    }
    return true;
}

public function parseIncomingParams() {
    $parameters = array();


    if (isset($_SERVER['QUERY_STRING'])) {
        parse_str($_SERVER['QUERY_STRING'], $parameters);
    }


    $body = file_get_contents("php://input");
    $content_type = false;
    if(isset($_SERVER['CONTENT_TYPE'])) {
        $content_type = $_SERVER['CONTENT_TYPE'];
    }
    switch($content_type) {
        case "application/json":
            $body_params = json_decode($body);
            if($body_params) {
                foreach($body_params as $param_name => $param_value) {
                    $parameters[$param_name] = $param_value;
                }
            }
            $this->format = "json";
            break;
        case "application/x-www-form-urlencoded":
            parse_str($body, $postvars);
            foreach($postvars as $field => $value) {
                $parameters[$field] = $value;

            }
            $this->format = "html";
            break;
        default:

            break;
    }
    $this->parameters = $parameters;
  }
 }
?>

在此之后,我继续使用适当的控制器,这是index.php /

之后的第一个元素

非常感谢您的时间和对不起,如果问题不是很清楚,因为我是新来的休息:/

0 个答案:

没有答案