В заголовке Express нет файлов cookie, в зависимости от пути - PullRequest
0 голосов
/ 27 октября 2019

Я использую express.js. У меня есть приложение с двумя контроллерами для обработки запросов: / auth & / posts

Я добавил авторизацию токена для установки куки авторизации.

Проблема в том, что когда я делаю запрос к /после этого запрос проходит через authMiddleware, который пытается проверить cookie, но не может получить к нему доступ, потому что свойство «cookie» не существует в request.header, несмотря на то, что я отправляю cookie через.

Еще более странно то, чтоон прекрасно работает, когда я делаю запрос по маршруту / auth, в этом случае request.header.cookie заполняется соответствующим образом.

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

class PostsController implements Controller {
  public path = '/posts';
  public router = express.Router();

  constructor() {
    this.initializeRoutes();
  }

  public initializeRoutes() {
    this.router.get(this.path, this.getAllPosts);
    this.router.get(this.path + '/:id', this.getPostById);
    this.router.all(this.path + '/*', authMiddleware)
    .patch(this.path + '/:id', this.updatePostById)
    .delete(this.path + '/:id', this.deletePostById);
    this.router.post(this.path, authMiddleware, this.createAPost);
  }
class AuthenticationController implements Controller {
    public path = '/auth';
    public router = express.Router();
    private user = userModel;

    constructor() {
        this.initializeRoutes();
    }

    private initializeRoutes() {
        this.router.post(`${this.path}/register`, this.registration);
        this.router.post(`${this.path}/login`, this.login);
    }
private initializeMiddlewares() {
      this.app.use('/*', (req, res, next) => {
        console.log(req.headers);  // returns headers with cookie for /auth only
        const cookies = req.headers.cookie.split(';'); // fails here on /posts
        const parsedCookies = {};
        cookies.forEach( pair => {
          const key = pair.split('=')[0];
          const value = pair.split('=')[1];
          if(key && value){
            parsedCookies[key] = value;
          }     
        })
        req.cookies = parsedCookies;
        console.log(req.cookies);
        next();
      })
      this.app.use(bodyParser.json());

    }

Конечно, я хотел бы получить доступ к свойству cookie независимо от маршрута.

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

1 Ответ

0 голосов
/ 27 октября 2019

Исправлено.

При создании файла cookie с Авторизацией, если пропустить параметр Path, по умолчанию используется текущий путь (который является / auth). Изменил это на / и это сделало куки доступными для разных маршрутов.

private createCookie(tokenData: TokenData) {
        return `Authorization=${tokenData.token}; HttpOnly; Max-Age=${tokenData.expiresIn}; Path=/`;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...