2015-12-21 37 views
1

我試圖通過角度將登錄信息從角度傳遞到後端快速端點。正在進行身份驗證的護照中間件每次都會失敗並進入失敗重定向。麻煩的是,我無法通過文檔找到它所期望的POST參數,或者它們在做什麼。這是我使用的策略(通過userapp.io插件)的失敗,還是實際的用戶名/密碼錯誤?護照中間件預期參數

登錄端點看起來是這樣的:

router.post('/login', passport.authenticate('userapp', { 
    failureRedirect: '#/login', 
    failureFlash: 'Invalid username or password', 
    successFlash: 'Welcome!' }), 
    function (req, res) { 
      res.cookie(SESSION_TOKEN, req.user.token); 
      res.redirect('/'); 
     }); 

(請注意,這是最終連接到/auth/login,它匹配下面的POST操作)

是提交到端點的形式如下:

<form method='post' action='/auth/login'> 
    <input name="login" placeholder="Username"><br> 
    <input name="password" placeholder="Password" type="password"><br> 
    <p><button type="submit">Log in</button></p> 

    <p ng-show="loading"><img src="https://app.userapp.io/img/ajax-loader-transparent.gif"></p> 
    <p ng-show="error">{{ error.message }}</p> 
</form> 

這是否正確提交數據到端點,我該如何去進一步調試發生了什麼?現在觀察到的行爲僅僅是登錄失敗,並且用戶以failureRedirect結束。

我知道的另一種選擇是使用ua-login指令shown in this example而不是我自己的形式。麻煩在於,似乎有一些無證的配置魔法;使用ua-login指令會導致客戶端發送到不存在的URL。現有的教程似乎沒有指出使ua-login有效的必要配置。

+0

您可以在將所有內容交給護照之前記錄'req.body'。在記錄參數並調用next()之前添加另一個函數。 (''/ login',function(req,res,next){console.log(req.body); next();},passport.authenticate('userapp'.....' –

+0

當路由爲'/ login'時,你的表單的行爲是'/ auth/login'。這是故意的嗎? –

+0

@Amir行爲是故意的;在問題中注意路由設置爲/ login,但是它連接在/ auth by another component。另外如果路由錯誤,失敗重定向不會發生,它只會是404。在額外的中間件上,我可以添加 - 但我已經知道請求體是什麼,因爲我的形式指定它。我不知道護照中間件期望做什麼正確的事 – FrobberOfBits

回答

1

您可以更改定義策略的默認參數(即usernamepassword)。

按照docs

passport.use(new LocalStrategy({ // or whatever you want to use 
    usernameField: 'login', // define the parameter in req.body that passport can use as username and password 
    passwordField: 'password' 
    }, 
    function(username, password, done) { // depending on your strategy, you might not need this function ... 
    // ... 
    } 
)); 

對於你提到的具體策略(userapp),我看了看源代碼。你可以找到這些值here。如果不存在usernameFieldpasswordField,將使用默認值(usernamepassword)。