2

ajaxを使用してログインシステムをセットアップしようとしています。

ユーザーがログインとパスワードを subdomain.domain.com (otherdomain.com の場合もあります) に挿入した後、Jquery $.post リクエストを rest.domain.com に送信すると、ユーザーは適切にログインします。

次に、rest.domain.com に別のリクエストを行って、ユーザーがログインしているかどうかを確認する (またはユーザーのログインが必要な他の操作を行う) と、セッションは空になります。

私は何を間違っていますか?

編集

クライアント アプリ

$.post('http://rest.domain.com/user/login',form,function(data){
   //Do what is needed
});

RESTful アプリ (Slim と uFlex を使用)

header('Access-Control-Allow-Origin: *');
session_start();

//User
//Check if logged
$app->get('/user/logged', function () use ($user, $app){
    print_r($_SESSION);
    echo $user->signed;
});

//Login
$app->post('/user/login', function () use ($user, $app) {
    $username = isset($_POST['email']) ? $_POST['email'] : false;
    $password = isset($_POST['password']) ? $_POST['password'] : false;
    $auto = isset($_POST['auto']) ? $_POST['auto'] : false;

    $user->login($username,$password,$auto);

    if($user->signed){
        print_r($_SESSION);
    }else{
        //Display Errors
        foreach($user->error() as $err){
            echo "<b>Error:</b> {$err} <br/ >";
        }
    }
});
4

3 に答える 3

2

同一オリジン ポリシーに違反していると思います。異なるドメインに対して Ajax リクエストを行うことはできません。または、少なくともそれが SOP で規定されていることです。それはあなたが見るべきものです。

上記の手順を実行した後、ブラウザーを使用して、保存されている Cookie を調べます。Cookie はサブドメインごとに保存されるため、PHP_SESSIDCookie (を使用している場合$_SESSION) が間違ったサブドメインに存在する可能性があります。

セッションをどのように保存しているかについて、より多くの洞察を提供できますか?

上記に関係なく、すべての Ajax リクエストをajax.php同じサブドメイン、プロトコルなど (SOP のすべてのルール) の同じターゲット ファイルに送信し、サーバー レベルでリクエストをルーティングすることをお勧めします。

于 2013-04-06T09:01:23.603 に答える
0

セッションは、rest.domain.com にバインドされた Cookie に保存される可能性があります。

このスレッドを参照してください: jquery の .ajax() メソッドがセッション Cookie を送信しないのはなぜですか?

この種の認証をサポートするには、REST API と Web サイトの両方を同じドメインに配置するか、クライアントとサーバー間で交換されるヘッダー (制御可能) に基づいてセッション認証を定義します。

たとえば、最初の認証を実行した後、ランダムなセッション ID (PHP セッション ID ではない) と次の要求 ID を生成し、HTTP ヘッダー経由でクライアントに送り返すことができます。

クライアント側では、session-id と next-request-id を読み取り、それを REST API への後続のリクエストに使用します。

REST API は、session-id と next-request-id をチェックして検証します。有効な場合、リクエストは認証されます。応答では、同じセッション ID と新しい次の要求 ID がクライアントに送り返されます。

サード パーティによるセッションの改ざんを回避するには、request-id が 2 回使用された場合、session-id を無効にする必要があります。

ページを変更してもセッション ID を再利用するには、両方をブラウザーの localStorage に保存します。

于 2013-04-06T09:02:27.560 に答える