当前位置: 首页 > 知识库问答 >
问题:

如何在HTML和API调用具有不同域的站点中使用cookie?

空英逸
2023-03-14

我在一个静态服务器(碰巧是Amazon S3)上托管了一个单页应用程序网站,所以它是从我的应用程序的URL提供的,比如“example.com”。因此,该网站位于“https://example.com”。这个站点使用了使用JavaScript的fetch()调用进行的API调用来执行站点的功能。因为example.com指向一个静态服务器,所以API调用会转到一个不同的域,我们称之为“xyz.execute-api.cloudhost.com”(它碰巧位于Amazon的API网关后面)。

我想使用cookie来管理用户会话。也就是说,我希望一个API调用在响应上返回一个Set-Cookie头,这将在浏览器上存储一个cookie,我希望其他一些API调用在请求上传递一个cookie头,然后可以在API中进行验证。cookie将始终来自API并返回到API(而不是页面的站点,因为页面本身托管在静态服务器上)。我希望cookie在会话之间保存(使用一些过期生存期,并理解浏览器可能会由于空间限制或用户操作而清除它)。

但这很难做到。首先,我的API调用都是到一个单独的域,所以我必须使用CORS来授权调用。当我使用CORS时,服务器必须在访问控制允许头列表中包含“cookie”,否则将不会返回它。此外,当我使用JavaScript的fetch()API进行调用时,我需要指定包括如下凭证:

获取(url,{method:“post”,credentials:“include”})

...否则cookie将不会被发送。返回cookie的API调用不需要接收cookie,但必须为此指定凭据:“include”,否则浏览器将忽略Set-Cookie响应头。

我还需要正确配置cookie本身。不同的API调用有不同的路径,所以我需要在Set-Cookie头中指定path=/。我更愿意设置samesite=strictsecurehttponlymax-age的值,但如果需要,我愿意灵活地设置。

就我所知。我仍然不能以跨平台的方式将我的Cookie放置(与Set-Cookie一起)并返回到服务器(以Cookie的形式)。由于页面域与API域不同,我可能需要指定samesite=none,但是如果我这样做了,最近的标准更改可能还需要设置secure(这很好)。即便如此,我也不能让所有的主要浏览器返回cookie。我还希望用相同的键设置一个新的cookie会取代现有的cookie,但我也不能这样做--当它返回时,我会看到两个cookie。

在这种情况下使用cookie的正确方法是什么?

共有1个答案

狄英哲
2023-03-14

正如您特别指出的那样,您希望从一个单独的站点向API站点发起这些请求,这意味着它们本质上是跨站点或第三方请求,因此cookie必须标记为samesite=none;安全

如果要使用samesite=strictsamesite=lax,则需要从SPA内部管理cookie。这可能更好,因为它允许您在那里存储会话标识符或令牌,然后将其作为单独的字段或头部传递给API。这样,您的API就不依赖于cookie,这可能更可取。

 类似资料:
  • 问题内容: 我需要使用Cookie在两个不同的域之间共享SSO信息,这可以在PHP中完成吗? 问题答案: 在两个域上,放置从另一个域提取的图像或其他Web元素。使用URL通知另一个域用户X在域A上,并让域B将该用户ID与该用户在其系统上关联。 正确执行起来有点复杂,但是如果您认为通过它会很好地进行。 Vinko在评论中(感谢!)指出,我不认为您了解所涉及的安全风险是理所当然的。如果此信息对任何人都

  • 问题内容: 我将Google App Engine用作我的android和Web应用程序的服务器,我使用Eclipse开发了使用Android Studio和Web应用程序的android应用程序。我在App Engine中部署了两个版本,第一个是Android应用程序,第二个是Web应用程序。我有自己的域名,该域名指向应用引擎的默认版本。我的问题是如何通过自定义域名指向第二版。我阅读了Googl

  • API Noob在这里,我真的很难找到API的教程,谷歌教程让我认为他们比我认为他们应该先进得多。以下是我试图做的: 谢谢你的帮助!

  • 我是JS和GAS的新手,到目前为止管理得相当好。然而,当我在JS中使用HTML时,我迷失了方向。我想使用谷歌的可视化API的时间线功能,并使用来自网站或工作表的数据,我想填充图表。 如何将HTML服务与JS结合起来,在google站点上显示时间线图?

  • 我是一个使用NIFI的大一新生。下面的NiFi dataflow从固定URL上的GET请求中获取数据,但是我的endpoint有一组参数来获取部分数据,例如页面ID。我希望避免为稍微不同的请求URL创建相同的工作流。 在API中,我可以请求可用的页面列表,我希望使用这样的请求的结果开始循环下面的工作流。我该怎么做??

  • 本文向大家介绍我们如何在HTML中使用不同的CSS类?,包括了我们如何在HTML中使用不同的CSS类?的使用技巧和注意事项,需要的朋友参考一下 在HTML中,根据元素的class属性定义样式规则。具有该类的元素将根据定义的规则进行格式化。这称为类选择器。要选择具有特定类的元素,需要编写一个句点(。)字符,后跟类的名称,例如.black 对于文档中class属性设置为black的每个元素,以黑色显示