2016-09-17 5 views
3

サーバー側で作成したJSON Webトークンをクライアントに送信して、クライアントがHTML5ローカルストレージに保存できるようにする方法を探しています。Facebookのログイン後に作成されたJSON Webトークンをクライアントに送信するにはどうすればよいですか?

具体的には、認証のためのパスポートを使用して、NodeJS/ExpressJSで構築された私のアプリケーションは、ユーザーの2種類があります:ローカルユーザーとFacebookのユーザーを。ローカルユーザが自分のユーザ名とパスワードを入力してログインフォームを記入すると

、クライアントは、サーバからの認証を要求し、サーバは、ローカルストレージに格納されているクライアントJWTに送信します。

次に、ユーザーは、データベースからデータを要求するために、トークンを見つけるためにローカル記憶域を調べるウェルカムページにリダイレクトされます。 Facebookのユーザーがログインしたときに

$.ajax({ 
    url: "/protectedEndpoint", 
    type: 'GET', 
    dataType: 'json', 
    beforeSend: function (xhr){ 
     xhr.setRequestHeader('Authorization', localStorage.token); 
    }, 
    success: function (data) { 
     ... 
    }, 
    error: function (e) { 
     alert(e.status + " " + e.statusText + " - " + e.responseText); 
    } 

はしかし、すべてがサーバ側で起こるので、私は、私は、ローカルストレージにJWTを保存することができますかわかりません。ここで

Facebookのパスポート認証のためのサーバ側のコードです:事前に

app.get('/auth/facebook', passport.authenticate('facebook', {scope: ['email']})); 

app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', {session: false, failureRedirect: '/login.html' }), 
    function (req, res) { 
     res.redirect('/welcome.html'); 
    }); 

おかげでたくさん!

答えて

1

OAuthとJWTを組み合わせることは、すでに判明しているように、主な使用例ではありません。可能な方法の1つは、OAuthコールバックのリダイレクトURLを使用してトークンを転送することです。

passport.authenticate('facebook', {session: false, failureRedirect: '/login.html' }), 
function (req, res) { 
    // Create JWT token here are pass it back to front application 
    res.redirect(`/token/${JWT}`); 
}); 

フロントエンドアプリケーションの設定では、トークンを処理できるルートがローカル/セッションストレージに保存されます。

+0

あなたが望むページにリダイレクトするだけです(ログインする前にどこに行っても構いません)。 '#token = $ {JWT}'をルートに追加するだけで、クライアントサイドのコードは単に '' window.hash''を探し、それを構文解析してlocalStorageに格納し、 '' window.hash''を空の文字列。 – idbehold

+0

もし私がfacebookのログインしか持っていないのなら、JWTを作るのは役に立たないのですか? –

+0

シングルページアプリケーションがあり、データのやりとりがREST APIを介して行われ、Cookieを使用しない、または使用しない場合、JWTは依然として可能な解決策の1つです。 JWTの使用には、長所と短所の両方があります。サーバー側のレンダリングされたアプリケーションで、とにかくCookieを使用してそこにセッションIDを格納している場合は、ここでJWTを使用する値が表示されません。 –

関連する問題