Angular2: PUT-запрос к Node-серверу не работает - аутентификация потеряна - PullRequest
0 голосов
/ 18 февраля 2019

Я использую Angular2 на стороне клиента и сервер-экспресс-узел в качестве моего бэкэнда.Узел-сервер работает как промежуточное программное обеспечение API, а также как моя служба аутентификации.Пользовательские запросы должны содержать действительный токен JWT для выполнения запросов на узле-сервере.

Все мои функции GET и другие функции PUT работают правильно.Я написал новый, который просто должен удалить идентификатор на стороннем API, не.

Более того, мой сервер нод-экспресс отправляет клиентским сообщениям об ошибках в некоторых точках.Это касается моей проблемы: всякий раз, когда я запускаю свою последнюю PUT-функцию, мой сервер отвечает «токен не предоставлен».Это происходит, когда пользователь не авторизован на стороне клиента.

Как я уже говорил, все остальные мои функции работают.this.createAuthenticationHeaders(); необходимо для выполнения правильного запроса на стороне сервера.Но это реализовано.

Другими словами, аутентификация теряется между клиентом и сервером, и я получаю свое собственное сообщение об ошибке: «Токен не предоставлен» .

Appointment-Detail.Component.ts

cancelAppointment() {
    this.authService.getProfile().subscribe(profile => {
      this.username = profile.user.username; // Set username
      this.email = profile.user.email; // Set e-mail
      if (profile.user.email) {
        this.apiService.cancelUserAppointment(this.id).subscribe(data => {
          console.log(this.id);
          if (!data.success) {
            this.messageClass = 'alert alert-danger'; // Set error bootstrap class
            this.message = data.message; // Set error message
          } else {
            this.messageClass = 'alert alert-success'; // Set success bootstrap class
            this.message = data.message; // Set success message
            // After two seconds, navigate back to blog page
          }
        });
      }
    });
  }

Служба API

cancelUserAppointment(id) {
    this.createAuthenticationHeaders();
    console.log('API SERVICE ' + id);
    return this.http
      .put(this.domain + 'api/appointments/' + id + '/cancel', this.options)
      .map(res => res.json());
  }

Функции службы API, которые работают

getCertificatesByUser(email) {
    this.createAuthenticationHeaders();
    return this.http
      .get(this.domain + 'api/user/' + email + '/certificates', this.options)
      .map(res => res.json());
  }

Маршрут сервера к стороннему API

  router.put('/appointments/:id/cancel', (req, res) => {
    console.log('hi');
    var id = req.params.id;
    const url = process.env.acuityUri + '/appointments/' + id + '/cancel';
    console.log(id);
  });

Промежуточное ПО аутентификации

router.use((req, res, next) => {
    const token = req.headers['authorization']; // Create token found in headers
    // Check if token was found in headers
    if (!token) {
      res.json({
        success: false,
        message: 'No token provided'
      }); // Return error
    } else {
      // Verify the token is valid
      jwt.verify(token, config.secret, (err, decoded) => {
        // Check if error is expired or invalid
        if (err) {
          res.json({
            success: false,
            message: 'Token invalid: ' + err
          }); // Return error for token validation
        } else {
          req.decoded = decoded; // Create global variable to use in any request beyond
          next(); // Exit middleware
        }
      });
    }
  });

1 Ответ

0 голосов
/ 18 февраля 2019

Не слишком углубляясь в ваши заголовки аутентификации, я вижу довольно явную проблему, которая, я думаю, может быть причиной ваших проблем.

Глаголы HTTP REST несут разные "намерения", намерениев этом случае мы особенно заботимся о том, должен ли ваш запрос иметь тело.

GET запросы делают не с телом.

PUT запросы делают несут тело.

Из-за этого HttpClient методы запроса angular (http.get, http.post и т. д.) имеют разные сигнатуры методов.

Чтобы перейти к поиску, сигнатура метода http.put принимает 3 параметра: url, body и options, тогда как сигнатура метода http.get принимает только 2: urlи options.

Если вы посмотрите на свой пример, для http.put вы предоставляете this.httpOptions в качестве параметра second вместо третьего, поэтому Angular упаковываетваш options объект как тело запроса PUT.Вот почему у вас есть рабочий пример и нерабочий пример;рабочий пример GET!

Решение?Просто поместите что-нибудь еще в качестве тела запроса во второй параметр и сдвиньте this.options вниз в третий слот параметра.Если вам все равно, что это, просто используйте пустой объект: {}.

Таким образом, ваш запрос должен выглядеть следующим образом:

return this.http
      .put(this.domain + 'api/appointments/' + id + '/cancel', {}, this.options)

По крайней мере, это должноотправьте все, что в this.options на сервер правильно.То, что в this.options правильно или нет, - это другая история.

Пример PUT вызов из документов Angular: https://angular.io/guide/http#making-a-put-request

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...