Django-rest-auth 使用 cookie 而不是授权标头

问题描述 投票:0回答:2

我想使用 Django Rest Framework 作为后端来构建 SPA 应用程序。该应用程序将使用 Token 身份验证。

为了获得最大的安全性,我想将身份验证令牌存储在 httpOnly cookie 中,因此无法从 javascript 访问它。但是,由于 cookie 无法从 javascript 访问,因此我无法设置“Authorization: Token ...”标头。

所以,我的问题是,我可以让 DRF 身份验证系统(或 Django-Rest-Knox/Django-Rest-JWT)从 cookie 中读取身份验证令牌,而不是从“Authorization”标头中读取它吗?或者“Authorization”标头是在 DRF 中进行身份验证的唯一且正确的方法?

django cookies django-rest-framework django-rest-auth django-rest-framework-jwt
2个回答
12
投票

我会重写

TokenAuthentication
的身份验证方法,假设令牌位于
auth_token
cookie 中:

class TokenAuthSupportCookie(TokenAuthentication):
    """
    Extend the TokenAuthentication class to support cookie based authentication
    """
    def authenticate(self, request):
        # Check if 'auth_token' is in the request cookies.
        # Give precedence to 'Authorization' header.
        if 'auth_token' in request.COOKIES and \
                        'HTTP_AUTHORIZATION' not in request.META:
            return self.authenticate_credentials(
                request.COOKIES.get('auth_token')
            )
        return super().authenticate(request)

然后设置 django-rest-framework 在设置中使用该类:

REST_FRAMEWORK = {
    # other settings...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        '<path>.TokenAuthSupportCookie',
    ),
}

0
投票

附加到设置

 REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'yourapp.authentication.BasicAuthFromCookie'
    ]
}

并创建文件

from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.exceptions import AuthenticationFailed

class BasicAuthFromCookie(JWTAuthentication):
    def authenticate(self, request):
        jwt_token = request.COOKIES.get('access')
        if not jwt_token:
            return None
        request.META['HTTP_AUTHORIZATION'] = f'Bearer {jwt_token}'
        return super().authenticate(request)
© www.soinside.com 2019 - 2024. All rights reserved.