問題
對(duì)于附帶身份憑證的請(qǐng)求 服務(wù)器不得設(shè)置origin為*怨喘,默認(rèn)的ajax請(qǐng)求等,在跨域訪問時(shí)不攜帶身份憑證山涡,可以設(shè)置withCredentials = true這樣會(huì)發(fā)送cookies堤结,這時(shí),服務(wù)器也要對(duì)應(yīng)響應(yīng)Access-Control-Allow-Credentials: true
對(duì)于一般的跨域請(qǐng)求是通過頭部的auth來確認(rèn)用戶身份的鸭丛,不使用cookie竞穷,所以請(qǐng)求時(shí)應(yīng)保證不攜帶cookie,這時(shí)服務(wù)器也不用管身份憑證cookie
django-cors-headers
配置
CORS_ORIGIN_ALLOW_ALL True
允許所有域名
CORS_ORIGIN_WHITELIST
允許的域名列表
CORS_ORIGIN_REGEX_WHITELIST
正則匹配域名
CORS_URLS_REGEX = r'^.*' 只能訪問api開頭的URL
CORS_ALLOW_METHODS
允許的請(qǐng)求方法列表
CORS_ALLOW_HEADERS
在請(qǐng)求時(shí)可攜帶的頭部
CORS_EXPOSE_HEADERS
響應(yīng)的頭部 默認(rèn)么有
CORS_PREFLIGHT_MAX_AGE
對(duì)于預(yù)檢請(qǐng)求的過期時(shí)間 默認(rèn)一天之內(nèi)不用再預(yù)檢
CORS_ALLOW_CREDENTIALS
允許在跨域請(qǐng)求中攜帶cookie,默認(rèn)不允許熟菲,帶cookie就可以直接通過session什么的直接進(jìn)行認(rèn)證看政,不需要額外的認(rèn)證頭部了,但對(duì)于django是設(shè)置了csrf校驗(yàn)的抄罕,見下方對(duì)于CSRF的(django2之后帶了SESSION_COOKIE_SAMESITE的設(shè)置允蚣,默認(rèn)為L(zhǎng)ax這樣阻止了session cookie)
CSRF相關(guān)
如果用了cookie認(rèn)證那么會(huì)有CSRF的校驗(yàn),但是django并不能識(shí)別你的相關(guān)設(shè)置呆贿,所以要設(shè)置django中的
CORS_ORIGIN_WHITELIST = [
'http://read.only.com',
'http://change.allowed.com',
]
CSRF_TRUSTED_ORIGINS = [
'change.allowed.com',
]
另有CORS_REPLACE_HTTPS_REFERER嚷兔,因?yàn)樯鲜龅腃SRF_TRUSTED_ORIGINS是在Djano1.9之后引入的,之前版本的用戶需要一個(gè)替代方案做入,這個(gè)設(shè)置會(huì)修改請(qǐng)求的Referer頭部來繞過django的CSRF校驗(yàn)冒晰,需要增加一個(gè)corsheaders.middleware.CorsPostCsrfMiddleware,放在django.middleware.csrf.CsrfViewMiddleware之后竟块,