使用chrome扩展内容脚本中的ajax调用发送cookie

时间:2014-04-21 06:50:46

标签: ajax google-chrome cookies google-chrome-extension cors

我为网站提供了Chrome扩展程序,该网站提供api来检查用户是否已登录。 api用于GET请求。因此,当我没有在其中烧焦时,

{ status: "ok", authenticated: false}

当我登录时,它会给我

{status : "ok", authenticated: true, id: 123}

这适用于浏览器,Chrome邮件扩展程序,如Postman和高级Rest Client。但是当我在我的Chrome扩展程序背景中使用它时,它总是说我不是经过身份验证的用户。我发现我制作的ajax调用不会为域发送cookie,但像Postman或Advanced REST客户端这样的chrome扩展会发送cookie以及XHR请求。

任何想法如何让ajax随之发送cookie。

这是我在Chrome扩展程序中的ajax调用

$.ajax({
    method:"GET",
    //  xhrFields: {
       //   withCredentials: true
       // },
       // crossDomain: true,
        url:"http://test-staging.herokuapp.com/user/details",
        success: function(result){
          if(result.status=="ok"){
            alert(JSON.stringify(result));
        cb(result.authenticated);
      }
    },
    error: function(err){
      alert("unable to authenticate user "+JSON.stringify(err))
    }
  })

更新1:

我可以从后台脚本中获取域Cookie详细信息。现在,我正在寻找如何使用ajax调用发送cookie?

2 个答案:

答案 0 :(得分:0)

如果将内容脚本注入具有原始内容的页面 (协议,主机和端口组合)与API来源不同:

  • 可以通过第三方Cookie阻止功能来阻止Cookie。
    检查是否已启用:import win32gui import win32con #to get currently active windows window = win32gui.GetForegroundWindow
    后台脚本不受此影响(从Chrome 81开始)。
  • 为{strong>提取设置chrome://settings/content/cookieswithCredentials: true)之一
    或将原点添加到credentials: 'include'的{​​{1}}部分中。
    要接收响应,在两种情况下都需要正确的CORS标头。

建议将API调用移入后台脚本,并将数据传递给 具有permissions的内容脚本来规避第三方Cookie阻止, CORB和CORS限制。如果您选择这样做,请将API来源添加到 manifest.json的{​​{1}}部分。

答案 1 :(得分:0)

这是一个古老的问题,但是对我来说,与在cookie上设置几个标记有关?

根据此博客文章:https://www.gmass.co/blog/send-cookie-cross-origin-xmlhttprequest-chrome-extension/

您需要设置samesite: None标志才能正常工作。这似乎是显而易见的,但是由于某些原因并未在大多数其他资源中提及。另外,如果您想使用samesite = None,则还需要在set-cookie:响应标头上使用Secure;标志,以便Chrome实际监听它。

对我来说,可能对您来说,这意味着您要弄乱API以正确设置这些标志。对我来说,这甚至意味着我必须在正在开发的localhost服务器上使HTTPS正常工作,以便chrome相信我cookie是安全的。此外,您需要credentials: 'include',如先前的海报所述。

对于使用烧瓶的任何人,这看起来像:

app.config['SESSION_COOKIE_SAMESITE'] = "None"
app.config['SESSION_COOKIE_SECURE'] = True 

在命令行上使用Https进行调试(导出FLASK_RUN_CERT = adhoc)。

这是一个很复杂的过程,花了我很长时间,但是上面链接的博客文章提供了巨大帮助。