#svelte #sveltekit
Вопрос:
Я использую oauth для входа в службу. После входа в систему приложение перенаправляет мое приложение на установленный uri перенаправления, который также указывает на мою конечную точку sveltekit (/обратный вызов). После того, как я проверю код и получу токен через конечную точку, я хотел бы перенаправить/отправить клиента обратно на домашнюю страницу с данными токена, но я не могу понять, как это сделать.
То, что я в настоящее время пробовал:
export async function get(response: IncomingRequest) {
if (response.query.has('code')) {
const code = response.query.get('code')
const url = `url endpoint to verify code above`
const verifiedCode = await fetch(url, {
method: 'POST',
headers: { 'Accept': 'application/json' }
})
if (verifiedCode) {
const data = await verifiedCode.json()
// redirect to homepage and give token to client
// tried:
return {
headers: {
location: '/'
},
body: data,
status: 302
}
}
}
}
Регистрация ответа в get()
конечной точке моей домашней страницы приводит к тому, что тело становится пустым, независимо от того, какое тело я поместил в эту конечную точку.
Комментарии:
1. Звуки, связанные с github.com/sveltejs/kit/issues/1711
Ответ №1:
С кем вы рассчитываете работать body: data
на стороне клиента? Домашняя страница? Как только браузер клиента получит 302, он начнет навигацию.
Правильным способом было бы отправить «set-cookie» как часть заголовка HTTP 302. Браузер клиента сохранит этот файл cookie, а также отправит его с любым будущим запросом на сервер. Очевидно, что он также может получить к нему доступ.
В случае, приведенном ниже, браузер клиента назовет файл cookie «токеном», и, предполагая, что у вашего токена или verifiedCode
у него есть дата истечения срока действия, вы также можете установить это (в секундах), как Max-Age
.
return {
headers: {
location: '/',
'set-cookie': `token=${data}; SameSite=Strict; Max-Age=${tokenAge}`
},
status: 302
}
Если вы хотите снова получать verifiedCode
сообщение на сервере всякий раз, когда пользователь вызывает конечную точку, вы можете прочитать его с response.headers.cookie
помощью .
Ответ №2:
Если вам нужен простой способ доступа к значению токена, сгенерированному поставщиком OAuth на стороне клиента, вы можете добавить эту информацию в качестве параметра запроса в запросе на перенаправление.
Чтобы вы могли сохранить все так, как оно у вас есть, просто добавьте эту информацию о маркере к значению местоположения. Давайте предположим, что verifiedCode-это объект, который выглядит следующим образом:
const verifiedCode = {
access_code: "eydkfsladkljdks..."
}
Затем вы можете просто добавить эту пару ключ значение следующим образом:
export async function get(response: IncomingRequest) {
if (response.query.has('code')) {
const code = response.query.get('code')
const url = `url endpoint to verify code above`
const verifiedCode = await fetch(url, {
method: 'POST',
headers: { 'Accept': 'application/json' }
})
if (verifiedCode) {
const data = await verifiedCode.json()
// redirect to homepage and give token to client
// tried:
return {
headers: {
location: `/?access_token=${verifiedCode.access_token}`
},
body: data,
status: 302
}
}
}
}
Затем этот параметр запроса будет доступен из index.svelte с помощью хранилища $page. Используйте $page.query.get(«access_token»), чтобы получить значение.