2017-12-13 13 views
1

customStateの目的を理解することができません。また、返信URLにデータを渡すことができますか?特に、私は元のURLをパラメータcustomStateに渡し、返信URL POSTで私に返送したと考えましたが、それはおそらくコード化されているようです異なる値に置き換えられました。認証を必要とするpassport-azure-adでstate/customStateを利用する

  1. 匿名ユーザーの訪問/page/protected:ここ

    は私が達成したいものです。

  2. コードは、ユーザーの兆候で
  3. 。順番にサインインするユーザーをリダイレクト passport.authenticateを呼び出し、あらかじめ設定されたURLリターン例えば: /auth/oidc/returnに返されます。
  4. コードは、フォームポストデータから情報を抽出します。
  5. ユーザーは/page/protectedに向けられています。

答えて

2

リターンURL(例えば、 "/ページ/保護されたが、")でラウンドトリップすることができ:

1)認証ミドルウェアはアズールADのB2Cにリダイレクトする前に、 "customState" パラメータを設定:

app.get('/login', function (req, res, next) { 
    passport.authenticate('azuread-openidconnect', { 
    response: res, 
    resourceURL: config.resourceURL, 
    customState: '/page/protected', // Or set to the current URL 
    failureRedirect: '/' 
    })(req, res, next); 
}, function (req, res) { 
    res.redirect('/'); 
}); 

2)認証ミドルウェアはアズールADのB2Cからの認証応答を検証した後、req.body.stateパラメータを取得する:

app.post('/auth/openid/return', function (req, res, next) { 
    passport.authenticate('azuread-openidconnect', { 
    response: res, 
    failureRedirect: '/' 
    })(req, res, next); 
}, function (req, res) { 
    res.redirect(req.body.state); 
}); 

「customState」パラメータの値を暗号化する必要があります。返されるURLを改ざんしたくない場合は、req.body.stateパラメータを復号化する必要があります。

認証ミドルウェアを受け取った後それ以外の場合は、認証ミドルウェアは、AzureのAD B2Cに認証要求をリダイレクトし、送信する前req.sessionに戻りURLを記述した後、読み(そして削除)するreq.sessionからこの戻りURL共通であり、 Azure AD B2Cからの認証応答を検証します。

+0

私はこれも見つけましたが、ユーザーが実際にログインしない限り、セッションを開始しない方がよいと思います。 – Thomas

+0

こんにちは@トーマス。上記の答えを、「状態」パラメータを使用してリターンURLをラウンドトリップできる方法で更新しました。 –

+0

ありがとう!私のコードには何らかの形で返された状態が混乱していた(または実際のb2cリクエストに自分の状態文字列が追加されていない)「何か」がありました。私のコードを整理し、あなたの例を使って私はそれを働かせることができました。感謝万円! – Thomas