Отсутствует токен авторизации заголовка Angular 2 - PullRequest
0 голосов
/ 11 июня 2018

Я столкнулся с досадной ошибкой.Я отправляю токен авторизации в заголовке http, но когда экспресс-запрос обрабатывается, токен аутентификации отсутствует.

вот мой код:

экспресс-аутентификация:

app.all(process.env.API_BASE + "*", (req: any, res: any, next: any) => {

    if (req.path.includes(process.env.API_BASE + "login")) return next();
    if (req.path.includes(process.env.API_BASE + "signup")) return next();

    console.log(req.headers);

    return auth.authenticate((err: any, user: any, info: any) => {
        if (err) { return next(err); }
        if (!user) {
            if (info.name === "TokenExpiredError") {
                return res.status(401).json({ message: "Your token has expired. Please generate a new one" });
            } else {
                return res.status(401).json({ message: info.message });
            }
        }
        app.set("user", user);
        return next();
    })(req, res, next);
});

angular2 (v6) GET-запрос:

      public get<T>(path: string, param: string | number = '', queryParams: Object = {}, etag?: string): Promise<T> {
    const requestOptions = this.generateOptions();
    const builtUrl = this.buildUrl(path, param, queryParams);
    return this.http.get<T>(builtUrl, requestOptions)
    .toPromise()
    .catch(this.handleGlobalError);
  }

  private generateOptions() {
    let headers = new HttpHeaders()
    .set('Content-Type', 'application/json')
    .set('Access-Control-Allow-Origin', '*')

   if (this._token) {
    headers = Object.assign(headers, headers.set('Authorization', 
    this._token));
  }

  if (etag) {
   headers = Object.assign(headers, headers.set('If-None-Match', etag));
  }

  const options = {
   headers: headers,
  };

  return options;
 }

Я также проверил это в PostMan, заголовки выглядят так: enter image description here

Сервер регистрировал входящие запросы, на картинке первый запрос пришел от POSTMAN, а второй от моего углового приложения:

enter image description here

РЕДАКТИРОВАНИЕ НА ОСНОВЕ ОТВЕТА НА ЮНИКОРН:

private generateOptions(etag?: string) {
let withCred = false;
let headers = new HttpHeaders()
  .set('Content-Type', 'application/json')
  .set('Access-Control-Allow-Origin', '*')

if (this._token) {
  withCred = true;
  headers.set('Authorization', this._token);
  //headers = Object.assign(headers, headers.set('Authorization', this._token));
}

const options = {
  headers: headers,
  withCredentials: withCred
};

return options;
}

к сожалению, он все еще сломан.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

При отправке запросов от HttpClient необходимо установить для переопределения withCredentials значение true, в противном случае заголовки авторизации удаляются.

Обычно это более очевидно при POST запросах, нотакже применимо к GET запросам.

См. https://angular.io/api/common/http/HttpClient#get для получения дополнительной информации о переопределениях http.

0 голосов
/ 11 июня 2018

Пожалуйста, замените раздел

 if (this._token) {
         headers = Object.assign(headers, headers.set('Authorization', 
         this._token));
 }

на

 if (this._token) {
     headers.set('Authorization', this._token);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...