問題
對于附帶身份憑證的請求 服務器不得設置origin為*,默認的ajax請求等,在跨域訪問時不攜帶身份憑證,可以設置withCredentials = true這樣會發送cookies,這時,服務器也要對應響應Access-Control-Allow-Credentials: true
對于一般的跨域請求是通過頭部的auth來確認用戶身份的,不使用cookie,所以請求時應保證不攜帶cookie,這時服務器也不用管身份憑證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
允許的請求方法列表
CORS_ALLOW_HEADERS
在請求時可攜帶的頭部
CORS_EXPOSE_HEADERS
響應的頭部 默認么有
CORS_PREFLIGHT_MAX_AGE
對于預檢請求的過期時間 默認一天之內不用再預檢
CORS_ALLOW_CREDENTIALS
允許在跨域請求中攜帶cookie,默認不允許,帶cookie就可以直接通過session什么的直接進行認證,不需要額外的認證頭部了,但對于django是設置了csrf校驗的,見下方對于CSRF的(django2之后帶了SESSION_COOKIE_SAMESITE的設置,默認為Lax這樣阻止了session cookie)
CSRF相關
如果用了cookie認證那么會有CSRF的校驗,但是django并不能識別你的相關設置,所以要設置django中的
CORS_ORIGIN_WHITELIST = [
'http://read.only.com',
'http://change.allowed.com',
]
CSRF_TRUSTED_ORIGINS = [
'change.allowed.com',
]
另有CORS_REPLACE_HTTPS_REFERER,因為上述的CSRF_TRUSTED_ORIGINS是在Djano1.9之后引入的,之前版本的用戶需要一個替代方案,這個設置會修改請求的Referer頭部來繞過django的CSRF校驗,需要增加一個corsheaders.middleware.CorsPostCsrfMiddleware,放在django.middleware.csrf.CsrfViewMiddleware之后,