【问题标题】:How to authenticate users with HttpOnly Cookie Django-React如何使用 HttpOnly Cookie Django-React 对用户进行身份验证
【发布时间】:2020-11-21 13:53:39
【问题描述】:

我正在尝试了解我的网络应用程序的身份验证系统,但我快疯了。在这一点上,我真的不知道我在做什么,

无论如何,我正在开发一个 Django-React Web 应用程序并使用 JWT 令牌进行身份验证。为了安全措施,我决定不在客户端存储 JWT 令牌,这就是我开始困惑的地方。所以我发出一个 axios POST 请求以从 React =>

登录
//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_token 进行身份验证,但由于它是 HttpOnly 我无法从客户端访问令牌。无论如何,通过一些研究,我发现我可以发送 csrf-token 进行身份验证(我可能错了),所以我向受保护的端点提出了请求 =>

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 Authentication Credentials not provided 响应。除了这个,我真的什么都不想做。

额外信息,

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

我需要任何可以从你们那里得到的建议。

【问题讨论】:

  • 您找到解决方案了吗?

标签: python django reactjs authentication cookies


【解决方案1】:

希望您已经解决了问题,但为了将来参考,向127.0.0.1提出请求不是localhost可以为我解决问题。

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 2019-01-10
    • 2021-11-02
    • 2018-07-23
    • 2019-07-17
    • 2020-10-30
    • 1970-01-01
    • 2022-01-01
    • 2022-08-09
    相关资源
    最近更新 更多