2016-06-12 16 views
1

私は、バックエンドでノードを使用し、フロントエンドで(ハッシュ履歴で)反応するアプリを持っています。URLフラグメントにリダイレクトすると、Chrome上でセッションがリセットされます(ノード/リアクション/リアクションルータ)

これは私のAPIエンドポイントのURLは次のようになり意味:
https://example.com/api/login

と私は、エンドポイントを反応させるルートからすべての断片である:私がしたい(のOAuth2を介して)でユーザーをログイン後
https://example.com/#/somePage

ユーザーをReact SPA内の特定のURLフラグメントにリダイレクトします。

これを行うための私の最初の考えは、サーバーにURLフラグメントにリダイレクトさせるだけでした。

マイルートハンドラは次のようになります。

これは正常に動作し、SPAから作られた任意のさらなるAPIリクエストが同じreq.sessionを共有し、したがって、トークンを持っていると認証された下流の要求を行うことができます持っているのSafariで
app.get('/oauthCallback', (req, res) => { 
    req.session.token = 'some token' 
    redirect('/#/someLoggedInPage') 
} 

しかし、Chromeでは、リダイレクト時に次のAPIリクエストによって新しいセッションが作成されるため、トークンが失われ、認証されたリクエストが成功しなくなります。

他のapiエンドポイント(SPAではなく)にリダイレクトすると、すべて正常に動作します。

SPAのルートである/にリダイレクトすると機能しません。

クロームがURLの断片とセッションをどのように処理するかわからないことがあるのでしょうか?

答えて

0

3日間の悲惨さの後、私はこれを解決しました。

誤った動作をしているChromeはSafariではないことが分かります。

library XHRリクエストを作成するために使用していますが、クライアントリクエストでサーバーにクッキーを送信しません。オプションを含める場合を除きます:credentials: 'same-origin。例えば

:サファリは混乱を引き起こすものである、とにかくそれらを送っているよう

fetch(endpoint, { method, headers, credentials: 'same-origin' }) 
    .then(res => { 
     // do something 
    }); 

が見えます。うまくいけば、これは誰かを助けるでしょう。

+0

これはまた、SPAリクエストが 'fetch'を使用する唯一のものであり、したがってこのオプションを必要とするため、SPAからのリクエストではなく、APiリクエストに対してなぜ機能するのかを説明します –

関連する問題