2017-02-23 4 views
1

symfonyでこれが可能かどうかわかりませんので、質問がありました。高レベルのシナリオは次のとおりリクエストヘッダからセッションIDを適用

  1. (symfonyにおいて内蔵)APIに要求が応答本体
  2. セッションIDを要求元に返す必要があり戻さセッションIDを含める必要がありますその後続の要求のためにそのヘッダに
  3. 要求ヘッダーがセッションIDを持っている場合、APIは、チェックする必要があり、それがない場合、それはsymfonyのセッションで、そのセッションを設定する必要があり
テスト目的のために

、私は、ブラウザのインス​​タンスのための2つのRESTクライアントを使用しています:

  • ポストマン(クローム)
  • HttpRequester(Firefoxの)

ここでは、私がやったコードのアプローチです:

郵便集配人からの要求:

POST http://path.domain/api/url/ 
Content-Type: application/json 
{ 
    "key": "value" 
} 

HTTPFoundationセッションを使用して、私はしてセッションを設定します。応答で、ここではそれを返し、その後

$session = new Session(); 
$session->set('session-id', $session->getId()); 
$session->set('timestamp', time()); 

:今

200 OK 
Content-Type: application/json 
{ 
    "session-id": "1a69f956b8efc5ab465356e3257a3230", 
    "timestamp": 1487850859 
} 

、別のインスタンスから別の応答をシミュレートするために、私はHttpRequesterを使用しますが、とセッションIDヘッダに:

POST http://path.domain/api/url/ 
Content-Type: application/json 
{ 
    "key": "value", 
    "session-id": "1a69f956b8efc5ab465356e3257a3230" 
} 

異なる要求インスタンスを有することにより、私は期待していそのsymfonyの意志遺伝子レートの新しいセッション(新しいタイムスタンプ値)。しかし私の場合は、セッションIDをに設定してリクエストヘッダーに設定したいので、以前の応答で返されたタイムスタンプにアクセスできます。

私はカーネルイベントを作成しました。リクエストを傍受し、リクエストがのセッションIDを持っていれば、セッションの設定を行います。私はこれを行う場合

// Get all PHP global variables 
$request = Request::createFromGlobals(); 

// Check if the request 
if ($request->headers->has('session-id')) { 
    $session = new Session(); 
    $session->setId($request->headers->get('session-id')); 
} 

はしかし、私はエラーを取得する:

"error": { 
    "code": 500, 
    "message": "Internal Server Error", 
    "exception": [ 
     { 
     "message": "Cannot change the ID of an active session", 
     "class": "LogicException", 
     ... 

私は何を逃したのですか?これは可能ですか?私はそこget機能があるが、これは仕事をしたりしません場合、私は知らないので、私は、通常のセッションを使用していないthe documentationで見た

if ($request->headers->has('session-id')) { 
    $session = new Session(); 
    $session->start(); 

    $sess = $session->get('session-id'); 
    $session->set('session-id', $sess); 
    ... 
} 

+1

[このチュートリアル](http://symfony.com/doc/current/security/api_key_authentication.html)に従ってトークン経由で認証を管理することは考えましたか?これが私のREST APIでの認証方法です。 – Jeet

+0

ええ、JWT認証とステートレスファイアウォールを調べてください – mblaettermann

+0

そこにユーザ名がありますが、私はそれを必要としません。私が今思うのは、別のインスタンスからセッションを取得する柔軟性を持たせることです。 –

答えて

0

は、あなたがこのような何かを試してみました。

お試しいただけますか?

関連する問題