搜尋

首頁  >  問答  >  主體

node.js - koa 无法将cookie写入到客户端

登录接口在 api.site.com 下,登录之后会把用户的access_token 以cookie 的方式往 site.com 这个域名下写,但是刷新页面之后在请求头里面看不到cookie,this.cookies.get()也是undefined,说明没有写成功。

使用的是本地开发环境,api.site.com 和 www.site.com 实际上都是 localhost(127.0.0.1),改的host实现的

代码如下:

if(validateEmail && validateUsername) {
    let [User] = yield this.db.query(sql, user);
    let id = User.id
    const token = yield user.generateAccessToken(id);
    this.cookies.set('access_token', token, {
        domain: '.site.com'
    })
    this.body = User;
}

求大神支招

更新

整了个 nginx 代理,问题依然存在

可以在response header 里面看到服务器端有写入的 set-cookies

但是在浏览器的cookies 里面看不到,页面请求也没有携带这个cookie

黄舟黄舟2785 天前429

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-04-17 15:27:25

    這兩天搜遍了google,so,尼瑪終於找到問題了,覺得非常有必要自己記錄一下。
    全都是因為這個鬼東西 Request.credentials

    The credentials read-only property of the Request interface indicates whether the user agent should send cookies from the other domain in the case of cross-origin requests. This is similar to XHR’s withCredentials flag, but with three available values (instead of two):
    
    omit: Never send cookies.
    same-origin: Only send cookies if the URL is on the same origin as the calling script.
    include: Always send cookies, even for cross-origin calls.

    當我們在發送跨域請求時,request 的credentials屬性表示是否允許其他網域發送cookie,
    該屬性有3個值:
    omit: 預設屬性,不允許其他網域發送cookie
    same-origin: 只允許同域發送cookie
    include: 總是允許發送cookie

    所以必須在發送post請求時加上 credentials: include,
    使用jq的話就是

    $.ajax({
            url: 'http://api.site.com/users',
            type: 'POST',
            data: postData,
            xhrFields: {
                withCredentials: true
            },
            success: function (data) {
                console.log(data)
            }
        })

    同時在服務端必須加上:

    ‘Access-Control-Allow-Credentials’:true
    

    這個問題困擾了很多天,還是讀書太少。 。 。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 15:27:25

    代幣

    回覆
    0
  • PHPz

    PHPz2017-04-17 15:27:25

    先用瀏覽器F12看一下cookies裡面確定有了你放的token

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 15:27:25

    朋友我跟你同樣的問題,後台程式碼是

    this.cookies.set('c', '3',{domain:'localhost',httpOnly:true);

    前台同樣是在response Headers 裡面能看到Set-Cookies

    你是說後台

    this.cookies.set('c', '3',{domain:'localhost',httpOnly:true,'Access-Control-Allow-Credentials':true})
    

    這樣子改嗎?
    前端請求怎麼辦?
    我的前端請求是這個樣子的:

    $.post("http://localhost:8080/user/userlogin?username="+username+"&password="+password,function(data,status){
                alert("Data: " + data.toString()+ "\nStatus: " + status);
                let userinfo = data[0];
                $("#txtUsername").html(userinfo.username);
                $("#txtp").show();
            });
    

    需要怎麼調整?

    回覆
    0
  • 取消回覆