Cookies 浏览器没有';不要储存饼干

Cookies 浏览器没有';不要储存饼干,cookies,vuejs2,laravel-5.6,Cookies,Vuejs2,Laravel 5.6,我正在从Laravel应用程序发送Cookie(http://backend.local)到Vue SPA(http://frontend.local:8080): Laravel侧(虚拟路线) Vue侧 响应标题: HTTP/1.1200正常 日期:2018年5月21日星期一09:42:35 GMT 服务器:Apache 设置Cookie:name=value;expires=2018年5月21日星期一10:42:36 GMT;最大年龄=3600岁;路径=/;域=.local 缓存控制:无缓存

我正在从Laravel应用程序发送Cookie(
http://backend.local
)到Vue SPA(
http://frontend.local:8080
):

Laravel侧(虚拟路线) Vue侧 响应标题:

HTTP/1.1200正常
日期:2018年5月21日星期一09:42:35 GMT
服务器:Apache
设置Cookie:name=value;expires=2018年5月21日星期一10:42:36 GMT;最大年龄=3600岁;路径=/;域=.local
缓存控制:无缓存,专用
访问控制允许来源:
不同:来源
X-RateLimit-Limit:60
X比率限制剩余:59
内容长度:2
保持活动状态:超时=10,最大=100
连接:保持活动状态
内容类型:text/html;字符集=UTF-8

但broswer存储中没有cookie(开发者控制台中的应用程序选项卡)。 怎么了



更新:我认为问题在于
http://frontend.local:8080
。我可以从url中删除端口号吗?

由于这是一个CORS调用,您需要将
setCredentials
设置为
true
。这是一种标准行为:默认情况下,标准CORS请求不发送或设置任何cookie。

withCredentials
属性将在请求中包括来自其他域的任何cookie,并设置来自其他域的任何cookie

因此,您的
Vue.js
代码将是:

axios.defaults.withCredentials = true
axios({
    method: 'POST',
    url: '//backend.local/api/login',

    // THIS IS IMPORTANT
    withCredentials: true
})
.then(response => {
    console.log(response)
}).catch(error => {})
[编辑]:阅读有关CORS的更多信息,请访问


如果没有帮助,请告诉我。

原始答案

浏览器将自动拒绝任何没有两个部分的域。因此,使用
.local
根本不被视为一个域。你至少需要两个层次。考虑下面的烧瓶应用程序我创建的演示相同的

from flask import Flask, request, make_response

app = Flask(__name__)

@app.route("/")
def index():
    resp = make_response()

    resp.set_cookie('value1', ".frontend.local", domain=".frontend.local")
    resp.set_cookie('value2', "frontend.local", domain="frontend.local")
    resp.set_cookie('value3', ".local", domain=".local")
    return resp

app.run(debug=True)
现在通过curl测试这个

$ curl -v frontend.local:5000
* Rebuilt URL to: frontend.local:5000/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to frontend.local (127.0.0.1) port 5000 (#0)
> GET / HTTP/1.1
> Host: frontend.local:5000
> User-Agent: curl/7.54.0
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Set-Cookie: value1=.frontend.local; Domain=.frontend.local; Path=/
< Set-Cookie: value2=frontend.local; Domain=frontend.local; Path=/
< Set-Cookie: value3=.local; Domain=.local; Path=/
< Content-Length: 0
< Server: Werkzeug/0.14.1 Python/3.6.5
< Date: Tue, 29 May 2018 12:58:20 GMT
<
* Closing connection 0
$curl-v前端。本地:5000
*已重建URL至:前端。本地:5000/
*正在尝试127.0.0.1。。。
*TCP_节点集
*连接到前端本地(127.0.0.1)端口5000(#0)
>GET/HTTP/1.1
>主持人:前端。本地:5000
>用户代理:curl/7.54.0
>接受:*/*
>
*HTTP 1.0,假设在正文之后关闭
当您在浏览器中导航时,您可以看到带有
Domain=.local
的cookie被丢弃,但剩余的2仍然存在

稍后,您可以看到两个cookie都已发送到同一页面的重新加载

更新1:2018年5月30日


由于您使用的是两个不同的域,因此应使用
frontend.local.com
backend.local.com
,并且应将cookie与域一起返回为
.local.com
,以便
backend
frontend
用作
local.com
的子域。然后
frontend.local.com
通过域共享获取
backend.local.com
设置的cookie,因为cookie域设置为
.local.com

没有帮助(不幸的是,这是使CORS cookie工作所需的唯一一件事。您可以做两件事。首先,在发出请求之前,尝试将withCredentials的默认值设置为true:axios.defaults.withCredentials=true;看看它是否工作。我听说axios在CORS帖子方面有一些奇怪的事情。其次,从c中的开发工具手动设置cookieChrome/firefox浏览器,然后进行Ajax调用。检查您的cookie是否在请求头中发送。如果是,则是其他问题。否则axios存在问题。我已尝试手动设置cookie并发送请求。cookie未到达服务器。axios似乎存在问题。我将尝试其他方法将请求从Vue发送到服务器an.谢谢你的回答。我刚刚尝试用
frontend.local
frontend.local
发送Cookie-浏览器中没有Cookie…@Tarasovych,因为你使用的是两个不同的域。你应该使用
frontend.local.com
backend.local.com
,Cookies应该与域a一起返回s
.local.com
,这样,
后端
作为子域工作,
前端
通过域共享获取这些cookies您的评论很有帮助!请将其添加到您的答案中!我可能会在17小时内给予+50奖励。@Tarasovych,我已更新了答案。请接受答案,奖金将自动获得一次奖励这使问题和答案都更加清晰。我不是问题的创造者,所以让我们等待创造者是否接受你的答案。
from flask import Flask, request, make_response

app = Flask(__name__)

@app.route("/")
def index():
    resp = make_response()

    resp.set_cookie('value1', ".frontend.local", domain=".frontend.local")
    resp.set_cookie('value2', "frontend.local", domain="frontend.local")
    resp.set_cookie('value3', ".local", domain=".local")
    return resp

app.run(debug=True)
$ curl -v frontend.local:5000
* Rebuilt URL to: frontend.local:5000/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to frontend.local (127.0.0.1) port 5000 (#0)
> GET / HTTP/1.1
> Host: frontend.local:5000
> User-Agent: curl/7.54.0
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Set-Cookie: value1=.frontend.local; Domain=.frontend.local; Path=/
< Set-Cookie: value2=frontend.local; Domain=frontend.local; Path=/
< Set-Cookie: value3=.local; Domain=.local; Path=/
< Content-Length: 0
< Server: Werkzeug/0.14.1 Python/3.6.5
< Date: Tue, 29 May 2018 12:58:20 GMT
<
* Closing connection 0