Вход пользователя с учетными данными, хранящимися в узле базы данных Монго и экспресс - PullRequest
0 голосов
/ 02 декабря 2018

Я пробовал много методов, и использование промежуточного программного обеспечения Passport помогло мне справиться с этой задачей.Я думаю, что я пропускаю какой-то последний шаг для того, чтобы это работало правильно, у меня сейчас нет ошибок.Вот мой код:

У меня есть login.component.html

<form method="POST" action="login">
  Username: <input type="text" name="username" required>
  Password: <input type="text" name="password" required>
  <input type="submit" value="Submit">
</form>

Модель пользователя:

var mongoose = require('mongoose');
const express = require('express');
const bodyParser = require('body-parser');
var app = express();

const Schema = mongoose.Schema;

let user = new Schema({
    username: String,
    password: String
});


const User = module.exports = mongoose.model('User', user);

Маршрут пользователя:

const express = require('express');
const router = express.Router();
const passport = require('passport');


let User = require('../models/user');

//Login form
router.get('/login', function(req, res)
{
    res.render('login');
})

//Login process
router.post('/login', function(req, res, next)
{
    passport.authenticate('local',
    {
        successRedirect: '/admin',
        failureRedirect: '/login',
        failureFlash: true
    })(req,res,next);
});

module.exports = router;

Passport.js

const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user');
const config = require('../config/db');
const bcrypt = require('bcryptjs'); 

module.exports = function(passport)
{
    passport.use(new LocalStrategy(function(username, password, done)
    {
        let query = {username:username};
        User.findOne(query, function(err, User)
        {
            if(err) throw err;

            if(!User)
            {
                return done(null, false, {message: 'No user found'});
            }

            bcrypt.compare(password, User.password, function(err, isMatch)
            {
                if(err) throw err;

                if(isMatch)
                {
                    return done(null, User);
                }
                else
                {
                    return done(null, false, {message: 'Wrong pass'});
                }
            });

        }); 
    }));

    passport.serializeUser(function(User,done)
    {
        done(null, User.id);
    });

    passport.deserializeUser(function(id, done)
    {
        User.findById(id, function(err, User)
        {
            done(err, User);
        });
    });
}

Я работал над этим часами, но безрезультатно.Было бы здорово, если бы кто-нибудь мог мне помочь или указать мне на мои следующие шаги, чтобы это тоже работало должным образом.

Я чувствую, что что-то упустил, но не уверен, что.Я не изменил какой-либо код внутри своего login.component.ts, это может быть причиной того, что код не делает то, что я хочу.

Вот login.component.ts:

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';



@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {


  constructor(private router: Router, ) {
   }

  ngOnInit() {
  }

}

1 Ответ

0 голосов
/ 02 декабря 2018

На вашем пользовательском маршруте, если вы хотите подписаться через POST / логин в своем приложении Angular и использовать его ответ для дальнейшего использования, вы можете сделать это без перенаправления и просто вернуть его ответ

Маршрут пользователя:

//Login process
router.post('/login', function(req, res, next)
{
    passport.authenticate("local", (err, user, info) => {
        if (err) return next(err);
        if (!user) return res.status(404).json('No user found');   // Or err.message / err.info depends on the passed error message you had set

        req.logIn(user, err => {
           if (err) next(err);
           else res.status(200).json(user);     // Return user object from successfully fetched passport user auth
        });
   })(req, res, next);
});

Служба пользователя:

  signIn(credentials: any): Observable<any> {
    return this.http
       .post('http://localhost:3000/auth/login', credentials)   // Or any url you had set.
       .map((response: any) => response);
  }

Компонент входа

login(credentials: any): void {       // You can either pass credentials or not as you can also access it inside your component with 'this.form.value'
   this.userService
      .signIn(credentials)
      .subscribe(
         response => {
            localStorage.setItem("user", JSON.stringify(user));  // Optional; Store your user/token response on the localStorage for future reference.
             this.router.navigate([ "/home" ]);                  // Navigate to the next page after user is authenticated
         },
      error => console.error(error)
      );
}
...