Перенаправьте конечную точку sveltekit и передайте данные на страницу

#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»), чтобы получить значение.