I am building a django-react app, using Django to render the templates, Django REST framework for the api endpoints, and React on top of django templates.
I am using 'rest_framework.authentication.SessionAuthentication'
and I have implemented the authentication routes but django's built-in authentication methods (login
, logout
, authenticate
) only seem to work with the templates rendered by django and not with the React components. By this I mean if i have a view like
def home_page(request, *args, **kwargs):
print("local USER >>>", request.user)
print("local SESSION >>>", request.session)
return render(request, 'pages/homepage.html',
{}, status=200)
and I visit the route after logging in, it would print out both the user
and the session
object.
But for the api views,
@api_view(['GET', 'POST'])
@permission_classes([IsAuthenticatedOrReadOnly])
def post_list_view(request, *args, **kwargs):
print("api USER >>>", request.user)
print("api SESSION >>>", request.session)
...
I get AnnonymousUser
and None
even if I'm logged in.
When i checked the browser cookies, i found both the csrftoken
and sessionid
cookies.
But if I try a post request, I get 403 Forbidden
error with "Authentication credentials were not provided." message. (I have also set withCredentials
to true.) And in the request headers there was only the X-CSRFToken
header (with the token) but sessionid
cookie was missing.
At this point, I just don't know what to do next. Should I manually set the session cookie? Or, should I customize the built-in methods? (If so, please tell me how I could do that.) What am I doing wrong here and how can I fix it?
edit:
axios configurations:
const options = {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRFToken': csrftoken
},
withCredentials: true
};
axios.post(url, data, options)
.then(response => {
console.log(response);
commentInput.current.value = '';
})
.catch(error => console.log(error));