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
問題解答
回答1:這兩天搜遍了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: 默認屬性,不允許其他域發送cookiesame-origin: 只允許同域發送cookieinclude: 總是允許發送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
這個問題困擾了好多天,還是讀書太少。。。
回答2:用token
回答3:先用瀏覽器F12看一下cookies里面確定有了你放的token
回答4:朋友我跟你同樣的問題,后臺代碼是
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();});
需要怎么調整?
相關文章:
1. bootstrp是col-md-12列的,只有col-md-10有內容,可以讓沒有內容的不占據位置嗎;2. python - Fiddler+Android模擬器抓取app,json數據被加密了,如何解析?3. thinkPHP5中獲取數據庫數據后默認選中下拉框的值,傳遞到后臺消失不見。有圖有代碼,希望有人幫忙4. java - 如何用圖畫的方式有效地表示多線程?5. wordpress里,這樣的目錄列表是屬于小工具還是啥?6. MySQL 使用 group by 之后然后 IFNULL(COUNT(*),0) 為什么還是會獲得 null7. 百度地圖 - Android app中準備接入地圖sdk,百度VS高德哪個好一點?8. python 3.4 error: Microsoft Visual C++ 10.0 is required9. 我的怎么不顯示啊,話說有沒有QQ群什么的10. 常量在外面不加引號會報錯。
