auth works now
This commit is contained in:
@ -40,7 +40,8 @@ INSTALLED_APPS = [
|
|||||||
'rest_framework.authtoken',
|
'rest_framework.authtoken',
|
||||||
"rest_framework",
|
"rest_framework",
|
||||||
"snippets",
|
"snippets",
|
||||||
"custom_auth"
|
"custom_auth",
|
||||||
|
'rest_framework_simplejwt'
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
@ -136,3 +137,13 @@ AUTH_PASSWORD_VALIDATORS = {}
|
|||||||
CORS_ALLOWED_ORIGINS = [
|
CORS_ALLOWED_ORIGINS = [
|
||||||
"*"
|
"*"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
REST_FRAMEWORK = {
|
||||||
|
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||||
|
'rest_framework_simplejwt.authentication.JWTAuthentication',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
SIMPLE_JWT = {
|
||||||
|
"TOKEN_OBTAIN_SERIALIZER": "custom_auth.serializers.MyTokenObtainPairSerializer",
|
||||||
|
}
|
||||||
|
|||||||
9
api/app/custom_auth/serializers.py
Normal file
9
api/app/custom_auth/serializers.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
|
||||||
|
from rest_framework_simplejwt.views import TokenObtainPairView
|
||||||
|
|
||||||
|
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
|
||||||
|
@classmethod
|
||||||
|
def get_token(cls, user):
|
||||||
|
token = super().get_token(user)
|
||||||
|
token['username'] = user.username
|
||||||
|
return token
|
||||||
@ -1,8 +1,16 @@
|
|||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from custom_auth import views
|
from custom_auth import views
|
||||||
|
from rest_framework_simplejwt.views import (
|
||||||
|
TokenObtainPairView,
|
||||||
|
TokenRefreshView,
|
||||||
|
TokenVerifyView,
|
||||||
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', include('rest_framework.urls')),
|
path('', include('rest_framework.urls')),
|
||||||
path('token/', views.CustomAuthToken.as_view()),
|
# path('token/', views.CustomAuthToken.as_view()),
|
||||||
path('register/', views.RegisterView.as_view())
|
path('register/', views.RegisterView.as_view()),
|
||||||
|
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
|
||||||
|
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
|
||||||
|
path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -4,6 +4,7 @@ from rest_framework.response import Response
|
|||||||
from rest_framework.request import Request
|
from rest_framework.request import Request
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
from rest_framework_simplejwt.tokens import RefreshToken
|
||||||
|
|
||||||
class CustomAuthToken(ObtainAuthToken):
|
class CustomAuthToken(ObtainAuthToken):
|
||||||
|
|
||||||
@ -12,12 +13,19 @@ class CustomAuthToken(ObtainAuthToken):
|
|||||||
context={'request': request})
|
context={'request': request})
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
user = serializer.validated_data['user']
|
user = serializer.validated_data['user']
|
||||||
token, created = Token.objects.get_or_create(user=user)
|
refresh = RefreshToken.for_user(user)
|
||||||
return Response({
|
|
||||||
'token': token.key,
|
return {
|
||||||
'user_id': user.pk,
|
'refresh': str(refresh),
|
||||||
'username': user.username
|
'access': str(refresh.access_token),
|
||||||
})
|
}
|
||||||
|
#
|
||||||
|
# token, created = Token.objects.get_or_create(user=user)
|
||||||
|
# return Response({
|
||||||
|
# 'token': token.key,
|
||||||
|
# 'user_id': user.pk,
|
||||||
|
# 'username': user.username
|
||||||
|
# })
|
||||||
|
|
||||||
|
|
||||||
class RegisterView(APIView):
|
class RegisterView(APIView):
|
||||||
@ -45,11 +53,16 @@ class RegisterView(APIView):
|
|||||||
username=username,
|
username=username,
|
||||||
password=password
|
password=password
|
||||||
)
|
)
|
||||||
token, created = Token.objects.get_or_create(user=user)
|
refresh = RefreshToken.for_user(user)
|
||||||
return Response({
|
return {
|
||||||
'token': token.key,
|
'refresh': str(refresh),
|
||||||
'user_id': user.pk,
|
'access': str(refresh.access_token),
|
||||||
'username': user.username
|
}
|
||||||
}, status=200)
|
# token, created = Token.objects.get_or_create(user=user)
|
||||||
|
# return Response({
|
||||||
|
# 'token': token.key,
|
||||||
|
# 'user_id': user.pk,
|
||||||
|
# 'username': user.username
|
||||||
|
# }, status=200)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return Response({"message": "Something went wrong, registration is not completed", "error": e}, status=500)
|
return Response({"message": "Something went wrong, registration is not completed", "error": e}, status=500)
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
django
|
django
|
||||||
django-rest-framework
|
django-rest-framework
|
||||||
django-cors-headers
|
django-cors-headers
|
||||||
|
djangorestframework-simplejwt
|
||||||
pygments
|
pygments
|
||||||
|
|||||||
@ -16,7 +16,8 @@ services:
|
|||||||
- "3000"
|
- "3000"
|
||||||
environment:
|
environment:
|
||||||
- WDS_SOCKET_PORT=0
|
- WDS_SOCKET_PORT=0
|
||||||
# volumes:
|
volumes:
|
||||||
|
- ./react/app:/app:z
|
||||||
# - ./docker_cache/node_modules:/app/node_modules
|
# - ./docker_cache/node_modules:/app/node_modules
|
||||||
nginx:
|
nginx:
|
||||||
image: nginx:1.23.4
|
image: nginx:1.23.4
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import React, { useState } from 'react';
|
import React, { useState, useContext } from 'react';
|
||||||
import {
|
import {
|
||||||
MDBContainer,
|
MDBContainer,
|
||||||
MDBNavbar,
|
MDBNavbar,
|
||||||
@ -18,9 +18,11 @@ import {
|
|||||||
import 'mdb-react-ui-kit/dist/css/mdb.min.css';
|
import 'mdb-react-ui-kit/dist/css/mdb.min.css';
|
||||||
import "@fortawesome/fontawesome-free/css/all.min.css";
|
import "@fortawesome/fontawesome-free/css/all.min.css";
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
import AuthContext from "../context/AuthContext";
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const [showBasic, setShowBasic] = useState(false);
|
const [showBasic, setShowBasic] = useState(false);
|
||||||
|
const { user } = useContext(AuthContext);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MDBNavbar expand='lg' light bgColor='light'>
|
<MDBNavbar expand='lg' light bgColor='light'>
|
||||||
@ -46,7 +48,7 @@ export default function App() {
|
|||||||
</MDBNavbarLink>
|
</MDBNavbarLink>
|
||||||
</MDBNavbarItem>
|
</MDBNavbarItem>
|
||||||
<MDBNavbarItem>
|
<MDBNavbarItem>
|
||||||
<MDBNavbarLink href='#'>Link</MDBNavbarLink>
|
<MDBNavbarLink href='#'>News</MDBNavbarLink>
|
||||||
</MDBNavbarItem>
|
</MDBNavbarItem>
|
||||||
|
|
||||||
<MDBNavbarItem>
|
<MDBNavbarItem>
|
||||||
@ -57,21 +59,25 @@ export default function App() {
|
|||||||
<MDBDropdownMenu>
|
<MDBDropdownMenu>
|
||||||
<MDBDropdownItem link>Public snippets</MDBDropdownItem>
|
<MDBDropdownItem link>Public snippets</MDBDropdownItem>
|
||||||
<MDBDropdownItem link>My snippets</MDBDropdownItem>
|
<MDBDropdownItem link>My snippets</MDBDropdownItem>
|
||||||
<MDBDropdownItem link>Something else here</MDBDropdownItem>
|
<MDBDropdownItem link>Shared to me snippets</MDBDropdownItem>
|
||||||
</MDBDropdownMenu>
|
</MDBDropdownMenu>
|
||||||
</MDBDropdown>
|
</MDBDropdown>
|
||||||
</MDBNavbarItem>
|
</MDBNavbarItem>
|
||||||
|
|
||||||
<MDBNavbarItem>
|
<MDBNavbarItem>
|
||||||
<MDBNavbarLink disabled href='#' tabIndex={-1} aria-disabled='true' background='#3b71ca'>
|
<MDBNavbarLink disabled={user && false} href='#' tabIndex={-1} aria-disabled='true' background='#3b71ca'>
|
||||||
New snippet
|
New snippet
|
||||||
</MDBNavbarLink>
|
</MDBNavbarLink>
|
||||||
</MDBNavbarItem>
|
</MDBNavbarItem>
|
||||||
|
</MDBNavbarNav>
|
||||||
|
<MDBNavbarNav right>
|
||||||
|
{ user && (
|
||||||
<MDBNavbarItem>
|
<MDBNavbarItem>
|
||||||
<MDBNavbarLink href='#' tabIndex={-2} aria-disabled='true' color='#3b71ca'>
|
<MDBNavbarLink href='#' aria-disabled='true' background='#3b71ca'>
|
||||||
admin
|
{user?.username}
|
||||||
</MDBNavbarLink>
|
</MDBNavbarLink>
|
||||||
</MDBNavbarItem>
|
</MDBNavbarItem>
|
||||||
|
)}
|
||||||
</MDBNavbarNav>
|
</MDBNavbarNav>
|
||||||
</MDBCollapse>
|
</MDBCollapse>
|
||||||
</MDBContainer>
|
</MDBContainer>
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { createContext, useState, useEffect } from "react";
|
|||||||
import jwt_decode from "jwt-decode";
|
import jwt_decode from "jwt-decode";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
|
|
||||||
const AuthContext = createContext("");
|
const AuthContext = createContext();
|
||||||
|
|
||||||
export default AuthContext;
|
export default AuthContext;
|
||||||
|
|
||||||
@ -25,8 +25,7 @@ export const AuthProvider = ({ children }) => {
|
|||||||
const response = await fetch("http://127.0.0.1/api/auth/token/", {
|
const response = await fetch("http://127.0.0.1/api/auth/token/", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json"
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
},
|
},
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
username,
|
username,
|
||||||
@ -36,30 +35,29 @@ export const AuthProvider = ({ children }) => {
|
|||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
if (response.status === 200) {
|
if (response.status === 200) {
|
||||||
console.log(response, data)
|
|
||||||
setAuthTokens(data);
|
setAuthTokens(data);
|
||||||
setUser(jwt_decode(data.access));
|
setUser(jwt_decode(data.access));
|
||||||
localStorage.setItem("authTokens", JSON.stringify(data));
|
localStorage.setItem("authTokens", JSON.stringify(data));
|
||||||
history.push("/");
|
history("/");
|
||||||
} else {
|
} else {
|
||||||
alert("Something went wrong!");
|
alert("Something went wrong!");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const registerUser = async (username, password) => {
|
const registerUser = async (username, password, password2) => {
|
||||||
const response = await fetch("http://127.0.0.1/api/auth/register/", {
|
const response = await fetch("http://127.0.0.1/api/auth/register/", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json"
|
||||||
"Access-Control-Allow-Origin": "*",
|
|
||||||
},
|
},
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
username,
|
username,
|
||||||
password
|
password,
|
||||||
|
password2
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
if (response.status === 201) {
|
if (response.status === 201) {
|
||||||
history.push("/login");
|
history("/login");
|
||||||
} else {
|
} else {
|
||||||
alert("Something went wrong!");
|
alert("Something went wrong!");
|
||||||
}
|
}
|
||||||
@ -69,7 +67,7 @@ export const AuthProvider = ({ children }) => {
|
|||||||
setAuthTokens(null);
|
setAuthTokens(null);
|
||||||
setUser(null);
|
setUser(null);
|
||||||
localStorage.removeItem("authTokens");
|
localStorage.removeItem("authTokens");
|
||||||
history.push("/");
|
history("/");
|
||||||
};
|
};
|
||||||
|
|
||||||
const contextData = {
|
const contextData = {
|
||||||
|
|||||||
Reference in New Issue
Block a user