MEAN (SPA) простая авторизация - PullRequest
0 голосов
/ 02 июля 2018

У меня есть приложение для сборки, но сейчас я пытаюсь перенести его в приложение SPA. И я застрял на Авторизации.

Я могу зарегистрировать новых пользователей, войти в них и получить их токен. Но я не знаю, что происходит, когда я посылаю токен и пытаюсь проверить его в моем промежуточном программном обеспечении. Я думаю, что я делаю что-то не так в шаге 3 (потому что шаг 1-2 работает), но для полноты я добавил все шаги и мой код, связанный с этими шагами.

Может кто-нибудь помочь мне понять, что я делаю не так?

1> Зарегистрировать новую учетную запись (сохранить учетную запись в БД)

бэкенд:

router.post("/register", function(req, res){
CreateUser(req.body.username, req.body.password, 0, function(err, nwUser){
    if(err){
        console.log('error: ');
        return res.redirect("register"); //TODO: show the error message in 'err'
    }
        passport.authenticate("local")(req, res, function(){
            console.log('success, gonne try to make token:');
            //secret key,TODO: set in variable (or better environment)
            const token = jwt.sign(nwUser.toJSON(), "SECRETCODE");
            const result = res.json({nwUser, token});
            return result;
        });
    });
});

2> Вход в учетную запись (в случае успешной отправки зашифрованного токена Клиенту (угловой))

бэкенд:

router.post('/login',passport.authenticate('local'), function(req, res) {
    User.findById(req.user._id, function(err, foundUser){
        if(err){
            console.log('Error with logging in!');
            console.log(err);
            return err;
        }
        const token = jwt.sign(foundUser.toJSON(), "SECRETCODE");
        const result = res.json({foundUser, token});
        return result;
    });
});

3> Если для запроса теперь требуется авторизация, клиент (Angular) также должен отправить токен с запросом, а бэкэнд проверяет, является ли токен действительным (внутри промежуточного программного обеспечения). Если это так, данные возвращаются.

как я отправляю данные из angular:

const headers: HttpHeaders = new HttpHeaders();
headers.append('Authorization', 'Bearer ' + this.authService.getToken());

console.log('token before sending in data-storage: ' + this.authService.getToken());
this.httpClient.get<Category[]>(environment.backendServer + '/categories/',
  {observe: 'body', responseType: 'json', headers: headers}).pipe(map(
  (categories) => {
    console.log(categories);
    return categories;
  }
)).subscribe(
  (categories: Category[]) => {
    this.categoryService.setCategories(categories);
  }
);

промежуточное ПО, которое я использую в бэкэнде:

middlewareObj.authenticateJWT = function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.query.token || req.headers['x-access-token'];
//token = undefined????

// decode token
if (token) {

    // verifies secret and checks exp
    jwt.verify(token, app.get('SECRETCODE'), function(err, decoded) {
        if (err) {
            return res.json({ success: false, message: 'Failed to authenticate token.' });
        } else {
            // if everything is good, save to request for use in other routes
            req.decoded = decoded;
            next();
        }
    });

} else {

    // if there is no token
    // return an error
    return res.status(403).send({
        success: false,
        message: 'No token provided.'
    });

}
}

Пока мне удалось сделать шаг 1-2, хотя, возможно, есть области, которые можно улучшить. Но я застрял на шаге 3 ...

Я не понимаю, как я могу отправить токен из Angular на сервер.

1 Ответ

0 голосов
/ 23 июля 2018

Не похоже, что используемый вами заголовок совпадает с используемым токеном.

Вместо того, чтобы искать

req.headers['x-access-token']

до

req.headers['Authorization']

Так как это то, что вы добавили в свой заголовок. Или, если вы отправляете со стороны клиента, отправьте JSON как

{token: this.authService.getToken()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...