Slack поля: XMLHttpRequest cannot похвалите response for preflight is invalid (redirect)

Я использую angularjs@v1.3 чтобы делать request api slack. Как он говорит мне, Slack поля types нуждался в том, чтобы добавить Authentication в header. Я делаю request с postman и он возвращает мне файл, в котором я нуждаюсь.

GET /files-pri/... HTTP/1.1
Host: files.slack.com
Authorization: Bearer A_VALID_TOKEN
Cache-Control: no-cache
Postman-Token: POSTMAN_TOKEN

Сейчас, делая это с angular он возвращает меня XMLHttpRequest cannot load. Response for preflight is invalid (redirect).

$http(
  method: 'GET',
  url: url_private_download,
  headers: {
    Authorization: 'Bearer ' + token
  }
});

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

Обновление: В конце концов покажись проблемой с OPTIONS, как я разбираюсь в этом, angular(или браузер, я не уверен) только предотврати OPTIONS если Content-Type=text/plain. сейчас, проблема состоит в том, что я только могу делать это без Authorization.

Как я добавляю Authorization предотвращая preflight?

Настоящий Request, нуждается в Auth:

$http(
  method: 'GET',
  url: url_private_download,
  headers: {
    'Content-Type': 'text/plain',
  }
});

6
задан 23.05.2017, 15:39
3 ответа

Разум, из-за которого он дает тебе эту проблему,, - потому что preflights должны быть разрешенными сервером используя CORS123, это механизм безопасности, которая функционирует автоматически в браузерах но Postman, не браузер, так что preflight когда бы то ни было осуществляется, и заголовки Origin, Access-Control-Request-Headers и Access-Control-Request-Method они не добавлены автоматически и механизмы безопасности сервера не включаются.

Помещать Content-Type в text/plain он не поможет, так как, поместив header Authorization уже это не "простая просьба". Любая просьба, которая потенциально могла бы изменять данные, уже не систематизирует как "простая просьба". Это определение:

Будь должен осуществляться с "простым методом", который является просьбой, реализованной с одним из следующих глаголов http:

  1. GET
  2. POST
  3. HEAD

Будь должен осуществляться с только с "простыми заголовками", которые являются какими-то из следующих headers:

  1. Accept
  2. Accept-Language
  3. Content-Language
  4. Content-Type если это один application/x-www-form-urlencoded, multipart/form-data or text/plain

В твоем случае ты используешь header Authorization которым cors будет включен, хотя ты изменишь Content-Type. Это механизм, который не может быть предотвращенным, так как это решающая часть безопасности в Вебе, чтобы предотвращать такие атаки как CSRF.

Угловой используй json по умолчанию для Вашего Content-Type и я думаю, что Slack это не выносит

Sending json to slack in в http post request

Так что ты был бы должен делать это в одном config block

$httpProvider.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf8';

Или в одном run block

$http.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf8';

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

Is an https query string secure

http://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3.

Это также потребовало бы, чтобы Slack вынес этот тип удостоверения, что мне кажется, что возможно используя параметр token в query https://api.slack.com/faq#authentication

Это был бы способ это делать

$http(
    method: 'GET',
    url: url_private_download + '?token=' + token,
    headers: {
        // Este header no es necesario si ya lo definiste usando headers.commons
        'Content-Type': 'application/x-www-form-urlencoded;charset=utf8'
    }
});

Другое решение состоит в том, чтобы получать разрешение используя всю разгрузку сервера, но как я понимаю Slack, выносит cors, так что он проверяет, что ты использовал https и не http, чтобы делать твои просьбы, этот ответ может быть связанным:

Post request firebase response for preflight is invalid redirect cors

3
ответ дан 24.11.2019, 14:44

В обобщенные счета и отвечая на твой вопрос:

Как добавил Authorization предотвращая preflight?

Поскольку это у тебя есть, будь хорошо, что он перемещает, состоит в том, что как он комментирует @devconcept браузеры, они делают что-то, что называет preflights перед реальной просьбой. Ты должен оставлять это как дела и манипулировать стороны backend просьбами OPTIONS, чтобы пропускать их в случае, если у тебя будет фильтр или другое препятствие, которое преграждает путь этого типа просьб. Также имей в виду тему CORS, которая является только безопасностью, которая осуществляется для запросов перекрещенного AJAX ресурсов или вне достижения настоящего проекта, а именно вне пределов проекта.

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

1
ответ дан 24.11.2019, 14:44

Я верю в то, что devconcept это объясняя очень хорошо в Вашем ответе. Я копался с CORS и Slack и я принял решение повторно написать мой ответ, с которым я поспорил из-за того, что вношу что-то еще.

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

Следовательно просьба разряда файлов должна включать заголовок удостоверения.

$http(
  method: 'GET',
  url: url_private_download,
  headers: {
    Authorization: 'Bearer ' + token,
    'Content-Type': 'application/x-www-form-urlencoded;charset=utf8'
  }
}); 

И, поскольку он объяснил devconcept, эта просьба включает способ preflight посылая первую просьбу OPTIONS что не включает заголовок Authorization. Когда Slack получает эту просьбу, ответь с 'HTTP 301' с перенаправлением на главную страницу сеанса, потому что эта просьба требует удостоверения, а именно, Slack не приготовлен к этой просьбе.

С клиента было бы возможно делать просьбу разряда файла, не включая заголовка Authorization но будучи заверен заблаговременно в Slack с пользователем и пароль, потому что удостоверение осуществилось бы через куки-файл.

Код был бы этим: (хотя он не имеет чувства делать много это с клиента)

$http(
  method: 'GET',
  url: url_private_download,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded;charset=utf8'
  }
}); 

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

Часто мы не ремонтируем в вопросах безопасности, но они очень важны, этот чат, который Чема Алонсо дал в DotNetSpain 2016, заставил меня осознавать меня еще больше с этим.

Я надеюсь внести что-то с моим ответом, приветом.

Обновление 28.03.2016: Осветлять часть перенаправления в главную страницу сеанса Slack, мотивированную комментарием devconcept

1
ответ дан 24.11.2019, 14:44
  • 1
    Оно не функционирует: (я участвую в рыцарском турнире, как ты можешь видеть в actualizaci и # 243; n, когда Authorization добавляют, preflight включается и я возвращаюсь в начальную ошибку. Спасибо за помощь. – learnercys 14.03.2016, 16:59
  • 2
    @learnercys Я Верю в то, что в и # 241; adiendo заголовок Закоулка - контроля podr и # 237; чтобы функционировать, но я не уверен. Уже я считать и # 225; s – rsciriano 15.03.2016, 02:30
  • 3
    он это не упорядочивает): главная проблема, - что, добавив headers дополнительные (включая Cache-Control) браузер autom и # 225; ticamente добавляет preflight – learnercys 15.03.2016, 08:44
  • 4
    @learnercys Я это tem и # 237; в, потому что я не смог тестировать это. Podr и # 237; эксперт пробовать значит использовать КСМЛЬТТПРЕКЕСТ " в crudo". В этот art и # 237; зад MDN они комментируют, как предотвращать preflight. В этом же самом art и # 237; зад есть часть, в которой они говорят о env и # 237; или верительных грамот конфигурируя withCredentials = true, и #191; quiz и # 225; s с этим opci и # 243; n функционируйте? Посмотрим я имею немного, чтобы это тестировать, потому что он мне кажется интересным – rsciriano 15.03.2016, 10:57
  • 5
    @rsciriano у Них Есть один согрешите и # 241; или ошибка в твоем ответе. " который Slack отрезает, пересылая ее в нее p и # 225; gina начала sesi и # 243; n". Это браузер, который отрезает petici и # 243; n; сервер s и # 243; он это отвечает с ошибкой или не отвечает и браузер автоматически отменять и # 225; призыв к Аяксу. Помни tambi и # 233; n, что используется угловой, из-за которого interacci и # 243; n с Slack это против Вашего api с услугой $http используя ajax прямо, не переходя с одного сайта на другой p и # 225; ginas. Slack осуществляет OAuth2 [такой 111] как механизм безопасности не куки-файлы. Делать transload файлов в server верьте в м и # 225; s проблемы тех, которых он решает. – devconcept 28.03.2016, 20:39