跨orgin PHP应用程序的Javascript请求

跨orgin PHP应用程序的Javascript请求,javascript,php,jquery,request,Javascript,Php,Jquery,Request,我有一个PHP应用程序,我想在前端部分运行XMLHttpRequests,它运行得很好,因为它实际上与“正常”相同。这个很好用 当我开始尝试执行安全的跨源请求时,我感到非常困惑。例如,有些请求我只想在用户登录时才允许。但是,当测试会话是否仍然存在时,它不再存在。例如,我只是不希望随机的人进入某人的档案。或者获取任何我不想让随机人看到的数据 我想要什么 通过如下所示的此模型请求,但要确保它们的安全。因为我只想保护登录用户的一些数据。你是怎么做到的?我想不起来了 基本上,我现在有一个问题,我不能

我有一个PHP应用程序,我想在前端部分运行
XMLHttpRequests
,它运行得很好,因为它实际上与“正常”相同。这个很好用

当我开始尝试执行安全的跨源请求时,我感到非常困惑。例如,有些请求我只想在用户登录时才允许。但是,当测试会话是否仍然存在时,它不再存在。例如,我只是不希望随机的人进入某人的档案。或者获取任何我不想让随机人看到的数据


我想要什么 通过如下所示的此模型请求,但要确保它们的安全。因为我只想保护登录用户的一些数据。你是怎么做到的?我想不起来了

基本上,我现在有一个问题,我不能在PHP端检查用户是否有活动会话,因为PHP认为这是一个全新的东西。从本质上讲,你是如何像网络兄弟那样做的?这可能真的很蠢,但我不能把我的心思放在它上面


我试过的 我尝试在设置
$\u会话
的地方请求,然后在返回
$\u会话
的地方请求,但它什么也不返回。这意味着我无法检查请求是否来自loggedin用户。

您可以使用它跨设备安全通信

JSON Web令牌(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对进行签名。

基本上,每个请求都会发送一个令牌给要在登录后保护的源。那么服务器端你就可以得到这个令牌了。登录后,您将生成该令牌并将其包含在响应中。在前端,您可以将令牌存储在客户端计算机上的本地存储中。比如说

下面是一个超级基本的例子,说明了在PHP中需要做什么

使用javascript/jQuery进行登录。例如,将用户名/密码发送到login.php,并像通常那样对用户进行身份验证

login.php

use \Firebase\JWT\JWT;

$salt = 'some_salt_string';
$algo = 'HS256'; // allowed ones

$params = array(
    "iss" => 'http://example.com', // your own identification
    "aud" => ['user_id'=>4324], // client identification
    "iat" => time(), // start validity
    "exp" => time()+(3600*24) // end validity
);

$token = JWT::encode($params, $salt, $algo);

// example data
$data = [
    'example_1'=>'value 1',
    'example_2'=>'value 2'
];
$response = array_merge($data,['token'=>$token]);

header('Content-Type: application/json');
echo json_encode($response);
auth.php

use \Firebase\JWT\JWT;

/**
 * http://stackoverflow.com/questions/40582161/how-to-properly-use-bearer-tokens
 * Get header Authorization
 * */
function getAuthorizationHeader(){
    $headers = null;
    if (isset($_SERVER['Authorization'])) {
        $headers = trim($_SERVER["Authorization"]);
    }
    else if (isset($_SERVER['HTTP_AUTHORIZATION'])) { //Nginx or fast CGI
        $headers = trim($_SERVER["HTTP_AUTHORIZATION"]);
    } elseif (function_exists('apache_request_headers')) {
        $requestHeaders = apache_request_headers();
        // Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care about capitalization for Authorization)
        $requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));
        //print_r($requestHeaders);
        if (isset($requestHeaders['Authorization'])) {
            $headers = trim($requestHeaders['Authorization']);
        }
    }
    return $headers;
}
/**
 * http://stackoverflow.com/questions/40582161/how-to-properly-use-bearer-tokens
 * get access token from header
 * */
function getBearerToken() {
    $headers = $this->getAuthorizationHeader();
    // HEADER: Get the access token from the header
    if (!empty($headers)) {
        if (preg_match('/Bearer\s(\S+)/', $headers, $matches)) {
            return $matches[1];
        }
    }
    return null;
}

$token = getBearerToken();
$salt = 'some_salt_string';
$algo = 'HS256';
$decoded_token = JWT::decode($token, $salt, $algo); // returns object

// you can access the audience properties to verify the user id against a requested resource
$user_id = $decoded_token->aud->user_id;

// finally check user id and either deny or allow access
javascript

<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-storage-api/1.9.4/jquery.storageapi.min.js"></script>
<script>

    var storage=$.localStorage;

    function login() {

        $.ajax({
            url: 'https://example.com/api/login',
            type: 'POST',
            data: {
                username:'Username',
                password:'Password'
            },
            success: function (data) {
                storage.set('auth_token',data.token); // store returned token to local storage using the jQuery plugin"value"
            },
            error: function () {
                alert('Error occured');
            },
        });

    }
    function testApi() {

        $.ajax({
            url: 'https://example.com/api/test',
            type: 'GET',
            beforeSend: function (xhr) {
                xhr.setRequestHeader('Authorization', 'bearer '+storage.get('auth_token')); // append the token. Mind the space.
            },
            data: {
                query:'value'
            },
            success: function () {

            },
            error: function () { 

            },
        });
    }
</script>

var-storage=$.localStorage;
函数登录(){
$.ajax({
网址:'https://example.com/api/login',
键入:“POST”,
数据:{
用户名:'username',
密码:'password'
},
成功:功能(数据){
storage.set('auth_token',data.token);//使用jQuery插件“value”将返回的令牌存储到本地存储
},
错误:函数(){
警报(“发生错误”);
},
});
}
函数testApi(){
$.ajax({
网址:'https://example.com/api/test',
键入:“GET”,
发送前:函数(xhr){
xhr.setRequestHeader('Authorization','bearer'+storage.get('auth_token');//追加标记。注意空格。
},
数据:{
查询:'value'
},
成功:函数(){
},
错误:函数(){
},
});
}

在安全页面或更好的API端点中包含验证代码片段。

CORS或跨源请求允许其他域访问您的web服务。您要求的功能是用户级访问,或者我们可以说哪些是公共的,哪些仅限于用户角色。这与CORS无关。第二,会话仅限于一个系统。请阅读本页w3schools,以便更好地理解本课程


您还可以在mysql或服务器端使用的任何db中维护一个用户级变量,以了解用户级是什么,然后将其带到正确的会话中,并在每个请求中检查会话值,以确定用户类型,如$会话[“user\u type”]您可以从数据库中获取,然后在注销时销毁会话。

Downvoter,请?我想改进我的问题,如果它没有遵循指导原则。你的责任在哪里。网络服务?这不是什么CORS,对吧?@frz3993是的,我管理所有方面。我已经研究了很多关于CORS的东西,但是我不能真正理解如何仅为登录用户保护某些请求。CORS中的来源指的是域而不是设备。当您使用术语REST时,它假定是无状态的。也就是说,如果要使用会话,客户端设备必须保存从服务器接收的会话cookie,该会话cookie由set cookie头发送。然后,他们必须在每个会话中发送会话cookierequest@frz3993好的,我的大脑已经开始明白了。让我试一下,我相信这就是我面临的问题。是的,我理解。我基本上被困在服务器端保存它的部分(信不信由你),因为我试图在会话中保存它(以便在用户登录时保存它)。但是,结果并不是那么好@frz3993提到了这个问题。我添加了一个示例OK,是的,那么Oauth2本质上是什么?使用一个支持。。谢谢,这是一个有用的答案。是的,这正是我试图做的,但是当访问会话变量时,它不再存在。它们一定是其他问题,请确保您编写了会话_start();在你试图利用session的每一个页面上,你都会得到它,但是当你发出另一个请求时,会话肯定会消失。我试过了,跨原点,一个请求我设置了会话。另一个请求在按下按钮时尝试检索会话值,但未成功。或者我遗漏了什么?你能提供演示片段吗?