2016-10-21 9 views
2

passport-azure-adを使用してユーザーを認証しようとしています。アプリは共通のログイン画面を表示しますが、ログインするとブラウザウィンドウは空白になり、動作を示すスピナーが表示されます。一方私のサーバーは、コールバックエンドポイントへのPOST要求の連続ストリームを受信して​​います。passport-azure-adを使用する際のトラブルPassportjsのOIDCStrategy

この間、私のパスポート機能(検証、serializeUserおよびdeserializeUser)はこれまでに呼ばれていません。ここ

私の戦略の定義である:

app.get("/auth/azure", passport.authenticate('azure', {failureRedirect: '/'})) 

app.post("/auth/azure/callback", 
    (req, res, next) => { 
    console.log("POST Callback Received!"); 
    next(); 
    }, 
    passport.authenticate("azure", { 
    failureRedirect: "/error.html" 
    }), 
    (req, res) => { 
    console.log("Recieved POST callback") 
    res.redirect("/user") 
    }) 

言及するいくつかのこと:

  1. 私はのためのアプリを開発してい

    passport.use("azure", new azureStrategy({ 
        identityMetadata: 'https://login.microsoftonline.com/common/.well-known/openid-configuration', 
        clientID: "*************************", 
        responseType: 'code id_token', 
        issuer: "https://sts.windows.net/********************/", 
        responseMode: 'form_post', 
        redirectUrl: "http://localhost:5055/auth/azure/callback", 
        allowHttpForRedirectUrl: true, 
        clientSecret: "**********************************" 
    }, function(iss, sub, profile, accessToken, refreshToken, done) { 
        console.log("ID TOken: ", profile.oid); //Never gets called 
        console.log("User" ,profile) //Never gets called 
        done(null, profile); 
    })); 
    
    passport.serializeUser(function(user, done){ 
        console.log("serialize: ", user) //Never gets called 
        done(null, user); 
    }) 
    
    passport.deserializeUser((user, done) => { 
        console.log("deserialize: ", user) //never gets called 
        done(null, user); 
    }) 
    

    そして、ここでは私のルート定義があります私の組織では、私たちのADでユーザーを認証するだけです。

  2. 私は最初にhttps://login.microsoft.com/<tenant>...バージョンのidentityMetadataを使用しようとしましたが、APIバージョンでサポートされていないアプリケーションに関するエラーが表示されました。一般的な方法を使用してその問題を解決したようです。
  3. 上記のとおり、console.log()はserializeUser、deserializeUserにコードされており、確認コールバックは決して呼び出されません。私nodejsサーバー上の

コンソールウィンドウは、単純にこのことを示しています

Request at: 1477083649230 GET/{}   
Request at: 1477083649235 GET /login.html {} 
Request at: 1477084498737 GET /auth/azure {} 
Request at: 1477085275630 POST /auth/azure/callback {} 
POST Callback Received! 
Request at: 1477085275980 POST /auth/azure/callback {} 
POST Callback Received! 
Request at: 1477085276335 POST /auth/azure/callback {} 
POST Callback Received! 
Request at: 1477085276679 POST /auth/azure/callback {} 
POST Callback Received! 
Request at: 1477085277042 POST /auth/azure/callback {} 
POST Callback Received! 

あなたは、私がそのセッションを殺すか、サイト上の別のページを参照するまで、それはちょうどに行くことがわかります。 POSTコールバックログが作成されている間は、認証後に行われるログは決して実行されないことに注意してください。

ご協力いただければ幸いです。

+0

あなたの2番目のミドルウェアコールは 'passport.authenticate(" azure "、{...})' –

+0

ではありません。残念です。私はコードサンプルをそれが想定されている方法で整理しました。 – RHarris

+0

'azureStragegy'とは何ですか?私はdocs(https://github.com/AzureAD/passport-azure-ad)で見つけることができません –

答えて

1

Googleの認証戦略を使用しているときは、GETを使用してポストバックしていました。しかし、私がAzureサンプルをたどったとき、私たちはPOSTでポストバックを始めました。

私は不要だったと思われるサンプルからすべてを取り除いていました。そのうちの1つはbodyParserでした。残念ながら、これはPassportがPOST要求の本文を解析して認証サーバーから返送される情報に到達するために必要なものでした。それは取ったすべてです

var parser = require("body-parser") 

... 
//before passport.initialize() 
app.use(parser.urlencoded({extended: true})); 

をし、すべてはそれがあるべきとして働き始め、次のように

ので、必要なビットでした。これは誰か他の誰もが頭痛を軽減することを願っています!

関連する問題