Перенаправление Fetch API не работает так, как я предполагал
Привет, ребята, переполнители стека! Я создаю небольшое приложение с использованием battle.net api.
Я пытаюсь пройти аутентификацию в API, используя Oauth с API выборки, но, похоже, он не делает то, что я хочу!
Итак, это мой код ''
const authUrl =
"https://eu.battle.net/oauth/authorize?client_id=clientid&scope=wow.profile&state=state&redirect_uri=https://localhost:3000/&response_type=code";
fetch(authUrl, {
method:"GET"
redirect: "follow",
mode: "no-cors",
});
и он должен перенаправить меня обратно сюда https: // localhost:3000 /? code ="code" & state ="state", причем код является фактическим кодом аутентификации.
Но когда я пытаюсь вызвать эту конечную точку, она не перенаправляет меня обратно. Из консоли разработчика я вижу, что он действительно делает звонок здесь https://eu.battle.net/oauth/authorize?client_id=clientid&scope=wow.profile&state=state&redirect_uri=https://localhost:3000/&response_type=code который дает статус 302. а затем перенаправляет меня на этот URL:
Но не вернемся к localhost. НО, если я вставляю authUrl прямо в браузер, он работает по назначению.
Что я делаю не так, внутри реагирую?
Извините, если я не совсем понимаю или сбиваю с толку. Если я пропустил что-то важное, просто спросите, и я предоставлю! Если бы кто-нибудь мог попытаться мне помочь, я был бы очень признателен! Заранее спасибо!
2 ответа
Поток кода аутентификации OAuth2 работает примерно так:
- Вы отправляете пользователя на адрес авторизации.
- Пользователь входит в систему, используя форму
- Пользователь перенаправляется обратно.
Если пользователь уже вошел в систему и есть файлы cookie, 2 можно пропустить.
Этот процесс никогда не будет работать с выборкой, так как он не предназначен для этого. Даже если перенаправление работает для вас, когда вы переходите вручную, это просто потому, что модель безопасности для прямого перехода к URL-адресу отличается от использования fetch.
Таким образом, вы не можете сделать это с помощью fetch. Вместо этого отправьте пользователя по этому URL-адресу, используя
document.location
.
Итак, ваша проблема здесь, похоже, вы не передаете переменные должным образом, вы не можете просто включать переменные между строками в javascript, вам нужно использовать интерполяцию строк с обратными кавычками.
Что-то вроде этого:
`https://eu.battle.net/oauth/authorize?client_id=${clientid}&scope=wow.profile&state=${state}&redirect_uri=https://localhost:3000/&response_type=code`;
fetch(authUrl, {
method:"GET"
redirect: "follow",
mode: "no-cors",
});
В качестве альтернативы вы можете использовать конкатенацию строк.
const authUrl =
"https://eu.battle.net/oauth/authorize?client_id=" + clientid + "&scope=wow.profile&state=" + state + "&redirect_uri=https://localhost:3000/&response_type=code";
fetch(authUrl, {
method:"GET"
redirect: "follow",
mode: "no-cors",
});