Python 如何使用HttpOnly Cookie Django React对用户进行身份验证
我试图了解我的web应用程序的身份验证系统,但我快发疯了。在这一点上,我真的不知道我在做什么 无论如何,我正在开发一个Django React Web应用程序,并使用JWT令牌进行身份验证。为了安全起见,我决定不在客户机中存储JWT令牌,这就是我的困惑开始的地方。因此,我请求axios POST从React=>Python 如何使用HttpOnly Cookie Django React对用户进行身份验证,python,django,reactjs,authentication,cookies,Python,Django,Reactjs,Authentication,Cookies,我试图了解我的web应用程序的身份验证系统,但我快发疯了。在这一点上,我真的不知道我在做什么 无论如何,我正在开发一个Django React Web应用程序,并使用JWT令牌进行身份验证。为了安全起见,我决定不在客户机中存储JWT令牌,这就是我的困惑开始的地方。因此,我请求axios POST从React=> //LOGIN USER export const login = (username, password) => dispatch => { //Headers
//LOGIN USER
export const login = (username, password) => dispatch => {
//Headers
const config = {
headers: {
"Content-type": "application/json"
}
}
//Request body
const body = JSON.stringify({ username, password })
axios.post("http://localhost:8000/auth/login/", body, config, {withCredentials: true})
.then(res => {
dispatch({
type: LOGIN_SUCCESS,
payload: res.data
})
}).catch(err => {
console.log(err)
dispatch({
type: LOGIN_FAIL
})
})
}
服务器响应和一些cookie=>
和JSON响应=>
然后我想使用access_令牌进行身份验证,但由于它是HttpOnly,所以我无法从客户端访问令牌。无论如何,通过一些研究,我发现我可以发送csrf令牌进行身份验证(我可能错了),所以我向受保护端点发出了一个请求=>
import axios from 'axios'
axios.defaults.xsrfCookieName = "csrftoken"
axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"
//ADD POST
export const addPost = (post) => dispatch => {
const config = {
headers: {
"X-CSRFTOKEN": 'csrftoken'
}
}
axios.post(`http://localhost:8000/api/v1/create/`, post, config, {withCredentials: true})
.then(res => {
dispatch({
type: ADD_POST,
payload: res.data
})
}).catch(err => console.log(err))
}
然而,在这个请求之后,我从服务器得到了401身份验证凭据未提供
响应。除此之外,我真的不知道该怎么办
额外信息
django settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':[
# 'rest_framework.authentication.TokenAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
# 'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
]
}
SIMPLE_JWT = {
'ROTATE_REFRESH_TOKENS': True,
}
CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'http://localhost:8080/#'
)
REST_USE_JWT = True
JWT_AUTH_COOKIE = 'myHttpOnlyCookie'
JWT_AUTH_SECURE = True
JWT_AUTH_SAMESITE = 'Strict'
CSRF_COOKIE_NAME = "csrftoken"
CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_SECURE = True
好的,我需要你们的建议。希望你们已经解决了这个问题,但为了将来的参考,向
127.0.0.1
请求而不是localhost
为我解决了这个问题。你找到解决方案了吗?