2017-05-21 7 views
0

私は現在、vue &という表現でアプリを作っています。パスポートのローカル戦略が呼び出されていない

私は認証ライブラリとしてパスポートを採用しました。私はこれを何度か使ってきました。

私はログイン要求をすると、パスポートミドルウェアは 'xx戦略'によってユーザーを認証することを知っています。

問題は登録要求がうまく機能していますが、ログインできません。

私は常にresponse.dataに「false」を取得します。

私は偽がどこから来るのか推測できません。

falseを返すリターンステートメントはありません。

私のコードは次のとおりです。

passport.deserializeUser((authId, done) => { 
    let hasUser 
    let users = User.findOneByAuthId(authId) 
    .then(results => (hasUser = results.length)) 

    if (hasUser) { 
    console.log('deserialize!') 
    done(null, users[0]) 
    } else { 
    console.log('no user') 
    done(null, { message: 'no user' }) 
    } 
}) 

passport.use(new LocalStrategy(
    (username, password, done) => { 
    let hasUser 
    let users = User.findOneByEmail(username) 
    .then(results => (hasUser = results.length)) 

    if (hasUser) { 
     let user = users[0] 
     let { hash } = user 

     if (User.checkPassword(password, hash)) { 
     done(null, { message: 'success' }) 
     } else { 
     done(null, { message: 'wrong password' }) 
     } 
    } else { 
     done(null, { message: 'wrong email' }) 
    } 
    } 
)) 

router.post('/register', (req, res) => { 
    if (!fun.emailChecker(req.body.username)) { 
    return res.status(403).json({ 
     message: 'Invalid Email' 
    }) 
    } 

    if (!fun.passwordChecker(req.body.password)) { 
    return res.status(403).json({ 
     message: 'Invalid Password' 
    }) 
    } 

    let hasUser 
    User.findOneByEmail(req.body.username) 
    .then(results => (hasUser = results.length)) 

    if (hasUser) { 
    return res.status(409).json({ 
     message: 'Email Exist' 
    }) 
    } else { 
    let user = { 
     authId: 'local: ' + req.body.username, 
     email: req.body.username, 
     hash: User.hashPassword(req.body.password), 
     displayName: req.body.displayName 
    } 

    User.create(user) 
    .then(results => { 
     if (!results) { 
     throw new Error('user creation error') 
     } else { 
     req.login(user, err => { 
      if (!err) { 
      req.session.save(() => { 
       return res.json({ success: true }) 
      }) 
      } 
     }) 
     } 
    }) 
    } 
}) 

router.post('/login', (req, res) => { 
    passport.authenticate('local', (err, result) => { 
    if (!err) { 
     return res.json(result) 
    } 
    })(req, res) 
}) 

// vue component 
methods: { 
onSubmit() { 
    axios.post('http://localhost:3001/auth/login', { 
    email: this.email, 
    password: this.password 
    }).then(response => console.log(response.data)) 
}, 
+0

router.post('/login', passport.authenticate('local'), (req, res) => { return res.json(req.user); // or whatever you want to return in case of login success }) 

(カスタムコールバックを使用する場合は、そのページに「カスタムコールバック」探しhereを文書化):代わりに、これを試してください? –

+0

これはvueコンポーネントに記録されています。 –

答えて

0

コードにはさまざまな問題があります。

間違った約束の取り扱いを開始:あなたがここに非同期コードの同期をしようとしている

let hasUser 
let users = User.findOneByAuthId(authId) 
.then(results => (hasUser = results.length)) 

if (hasUser) { ... } 

User.findOneByAuthId(authId).then(users => { 
    let hasUser = users.length; 

    if (hasUser) { 
    console.log('deserialize!') 
    done(null, users[0]); 
    } else { 
    console.log('no user') 
    done(Error('no user')); 
    } 
}); 

(私はかなりよく分からない理由を、あなたの方法:非同期クエリの結果に依存するコードは内部(deserializeUserで両方と戦略の検証ハンドラ)thenハンドラに移動させなければなりませんその名前が、最大1つの結果になり、アレイにつながる可能性があることを意味する)

またfindOneByAuthId、あなたが戻ってパスポートへのユーザデータとログインエラーを渡すための正しい規則を使用していない:

if (User.checkPassword(password, hash)) { 
    done(null, { message: 'success' }) 
} else { 
    done(null, { message: 'wrong password' }) 
} 

これは次のようになります(とは明らかに、doneが間違って呼ばれている他の場所があまりにも固定されなければならない):

if (User.checkPassword(password, hash)) { 
    done(null, user); 
} else { 
    done(null, false, { message: 'wrong password' }) 
} 

here下の "コールバックを確認し、" 文書化

を最後に、あなたにpassport.authenticate()を正しく使用していません。おそらくfalseが返されます。 ;

「response.data」であなたが言っ
+0

router.post( '/ login'、passport.authenticate( 'local')、(req、res)=> { return res.json(req.user); //ログインの際に返すもの成功 }) このアプローチでは、今、悪いリクエストエラーが発生します。 –

+0

他の変更もすべて実装しましたか? – robertklep

+0

私はどのように私のコードをすべて内部に移動するのか理解できません。 文字通り、すべてのコードを内部に移動していますか? –

関連する問題