Экспресс как прокси между сайтом А и сайтом С - PullRequest
0 голосов
/ 09 июля 2019

У меня есть приложение реакции (сайт A), экспресс-API (сайт B) и сторонняя служба oauth (сайт C).

На сайте A мне нужно, чтобы пользователь вошел на сайт C, чтобы они могли использовать его ресурсы. Поскольку я не хочу, чтобы идентификатор клиента / секреты были в моем клиенте (A), я настроил сайт B в качестве прокси между A и C.

A: localhost:3000
B: localhost:3001
C: example.com

У меня есть "proxy": "http://localhost/3001" настройки в моем package.json. Так что я могу делать что-то вроде fetch('/api/foo') на сайте A, и он успешно попадет на сайт B.

Вот тут-то и возникает мое замешательство. Я читал предыдущие SO-сообщения о CORS, но они говорят только о сайтах от A до B, они не учитывают сайт C (сторонние API, которыми они не владеют).

На сайте B я использую passport и passport-bnet для обработки oauth. Если я запустил сайт B и нажал на конечную точку oauth, он успешно вышел бы на сайт C, сам авторизовался и вернул нужный мне токен.

НО если я сделаю что-то подобное на сайте A:

function Foo(() => {
  return <button onClick={handleOnClick}>Click Me</button>

  function handleOnClick() {
    // doesn't work
    fetch('/api/auth').then(...)
  }
});

Тогда я получу ошибку cors.

Доступ к выборке в 'https://us.battle.net/oauth/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3001%2Fauth%2Fbnet%2Fcallback&scope=wow.profile&client_id=.............' (перенаправленный из' http://localhost:3001/auth/bnet') из источника 'null' был заблокирован политикой CORS: заголовок 'Access-Control-Allow-Origin' отсутствует на запрашиваемый ресурс. Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.

Если я заменил <button> onClick на тег привязки, то это сработает:

...
// works
return <a href="/api/auth">Click Me</a>
...

Что мне здесь не хватает? Опять же, я прочитал существующие ответы топ-корс на SO, но они используют только два сайта (где вы оба владеете ими). У меня есть только 2 из 3 в этом сценарии.

_Note, сайт C поддерживает http и https, а также поддерживает перенаправления localhost (что доказано правильной работой B -> C).

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