仅cookie-http会话应如何在具有单独API服务器的SPA上工作?

问题描述 投票:0回答:1

[当尝试在正在建立的SPA中确定how to authenticate with Facebook/Google时,有人指出我指向Stop using JWT for sessions

我正尝试使用仅HTTP的Cookie尝试一下。我的服务器是带Devise的Ruby on Rails,我的客户端是带React的JavaScript,尽管概念上的解决方案与我认为的特定技术无关。

我的应用程序通过转到projectx.lvh.me进行加载,然后向api.projectx.lvh.me进行查询以获取当前用户。一开始它是空的,因为用户尚未登录。发出呼叫请求以进行登录时,来自api.projectx.lvh.me的响应包含会话cookie hurra!但是projectx.lvh.meapi.projectx.lvh.me的下一个请求不携带cookie,因此,cookie似乎永远丢失了。即使在另一个选项卡上打开api.projectx.lvh.me也不会显示cookie。这应该工作吗?我想念什么?

我认为这被第三方cookie阻止所阻止,这就是为什么我们在这种情况下不能使用cookie的原因,我们必须使用jwt令牌(存储在cookie,本地存储或会话存储中)。

ruby-on-rails authentication session cookies single-page-application
1个回答
0
投票

通过将config/initializers/session_store.rb添加到包含以下内容的Rails应用程序,我设法使cookie在这种情况下起作用:

Rails.application.config.session_store :cookie_store, key: 'session', domain: :all

导致会话cookie不是用于api.projectx.lvh.me,而是用于.projectx.lvh.me

在前端,API调用需要包含withCredentials,对于Axios,它是将withCredentials选项设置为true:

Axios.post(`${apiEndPoint()}/users`, { user: values }, { withCredentials: true })

并且在fetch中将credentials选项设置为"include"

fetch(`${apiEndPoint()}/graphql`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    credentials: "include",
    body: JSON.stringify({
        query: operation.text,
        variables,
    }),
})
© www.soinside.com 2019 - 2024. All rights reserved.