У меня есть приложение реакции (сайт 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).