令牌认证休息API会话

时间:2016-04-21 09:08:09

标签: javascript php ajax rest

我正在使用Slim Framework来创建无状态REST API。在使用之前,我在服务器端创建了一个SESSION,并在每个页面上进行会话检查。但现在,我不知道如何控制它。

我的数据库中为每个用户都有一个api_key。在用户登录后,我使用api_key进行响应并将用户重定向到index.php。但是不保留api_key。如何使用Javascript将api_key传递给每个页面?原因是如果有人想要我的REST API中的数据,他们必须向我发送api_key,如果用户在我不想再次显示登录页面之前登录。

这是我的REST API部分:

  namespace Test
    {
        public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {

            }

            protected void Button1_Click(object sender, EventArgs e)
            {
                string yourval = TextBox1.Text.ToString();
            }
        }
    }

用AJAX调用:

$app->post('/userlogin', function() use ($app) {
    verifyRequiredParams(array('email', 'password'));
    $email = $app->request->post('email');
    $password = $app->request->post('password');

    $objUserRegLog = new UserRegistrationLogin;
    $result = $objUserRegLog->getUserByEmailAndPassword($email, $password);
    if (!$result) {
        $response["error"] = true;
        $response["message"] = "Error! Invalid e-mail address or password.";
    } else {
        $response["error"] = false;
        $response["id"] = $result["id"];
        $response["email"] = $result["email"];
        $response["api_key"] = $result["api_key"];
    }
    echoResponse(200, $response);
});

$app->get('/students', 'authenticateStudent', function() use ($app) {
    $objStd = new Students;
    $result = $objCases->getAllStudents();
    if (!$result) {
        $response["error"] = true;
        $response["error_msg"] = "An error occured.";
        $status_code = 404;
    } else {
        $response["error"] = false;
        $response["cases"] = $result;
        $status_code = 200;
    }
    echoResponse($status_code, $response);
});

function authenticateStudent(\Slim\Route $route) {
    $headers = apache_request_headers();
    $response = array();
    $app = \Slim\Slim::getInstance();

    if (isset($headers['Authorization'])) {
        $db = new DbOperation();
        $api_key = $headers['Authorization'];
        if (!$db->isValidStudent($api_key)) {
            $response["error"] = true;
            $response["message"] = "Access Denied. Invalid Api key";
            echoResponse(401, $response);
            $app->stop();
        }
    } else {
        $response["error"] = true;
        $response["message"] = "Api key is misssing";
        echoResponse(400, $response);
        $app->stop();
    }
}

2 个答案:

答案 0 :(得分:0)

嗯,您需要了解客户端发送给您的服务器的每个请求都是独立的,因此您需要在客户端系统中放置一个变量(令牌),以便让他在每个请求中发送它,所以你知道谁一直在和你的服务器通话。开始阅读:http://www.w3schools.com/php/php_cookies.asp

一旦了解了Cookie的工作原理和方式,请尝试进一步阅读有关身份验证和授权主题的内容。

答案 1 :(得分:0)

您有三种方式提供此类信息。

<强>缓存

在大多数情况下,如果您有登录屏幕,则需要使用Hector提到的Cookie。一个潜在的cookie问题,有些人不希望它们来自“随机”网站。但是,好处是您可以关闭选项卡,重新打开它,然后您仍然可以登录(这取决于cookie的类型,但在大多数情况下,您希望使用此类型)。

查询字符串

另一种繁琐的方法是使用会话标识符添加查询字符串参数。这也意味着您必须确保页面上的每个链接都包含该会话标识符。此外,它通常被视为一个安全问题,因为看着你肩膀的人可以看到会话标识符(坦率地说,除非他们有照片记忆......)对于阻止cookie的人,这是另一种方式。但是,由于它使用的是完全相同类型的会话标识符,因此您可能会侵犯用户在阻止Cookie时的含义。

HTML代码

最后一种方法是将值放在HTML中,这需要更多的工作。例如,您可以使用<meta ...>标记。至少就是这样,人们看着你的肩膀是隐藏的。但是,当某人点击你的链接时,你仍需要传输它。这意味着您必须使用JavaScript中的POST加载任何其他页面。那是非常传统的。就像以前的方法一样。您可能侵犯了用户“不跟踪请”的意愿。

安全性怎么样?

最安全的是与标记为仅HTTP的cookie建立HTTPS连接(即JavaScript无法访问它,因此无法使用它进行调整。)

所有其他方法都有其他安全问题。