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

时间:2017-11-13 22:33:49

标签: django cookies django-rest-framework django-rest-auth django-rest-framework-jwt

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

为了最大限度地提高安全性,我想将身份验证令牌存储在httpOnly cookie中,因此无法从javascript访问它。但是,由于无法从javascript访问cookie,我无法设置“授权:令牌...”标题。

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

1 个答案:

答案 0 :(得分:1)

假设令牌位于TokenAuthentication cookie中,我将覆盖auth_token的authenticate方法:

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').encode("utf-8")
            )
        return super().authenticate(request)

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

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