[当尝试在正在建立的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.me
对api.projectx.lvh.me
的下一个请求不携带cookie,因此,cookie似乎永远丢失了。即使在另一个选项卡上打开api.projectx.lvh.me
也不会显示cookie。这应该工作吗?我想念什么?
我认为这被第三方cookie阻止所阻止,这就是为什么我们在这种情况下不能使用cookie的原因,我们必须使用jwt令牌(存储在cookie,本地存储或会话存储中)。
通过将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,
}),
})