# JWT in django rest framewrok
###### tags: `python` `django` `backend`
install
generate token in /authentication/models.py
```
#
@property
def token(self):
token = jwt.encode(
{'username': self.username, 'email': self.email, 'exp': datetime.utcnow() + timedelta(hours=48)},
settings.SECRET_KEY,
algorithm='HS256')
# exp:expity time (how long the token can exist)
return token
```
create url in /authentication/urls.py
```
urlpatterns = [
#
path('user', views.AuthUserAPIView.as_view(), name='user')
]
```
make authentcation view /authentication/views.py
```
class AuthUserAPIView(GenericAPIView):
permission_classes = (permissions.IsAuthenticated, )
def get(self, request):
user = request.user
serializer = RegisterSerializer(user)
return response.Response({'user': serializer.data})
```
get token and decode
create /authentication/jwt.py
```
from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
from authentication.models import User
import jwt
from django.conf import settings
class JWTAuthentication(BaseAuthentication):
def authenticate(self, request):
auth_header = request.headers.get('Authorization')
auth_token = auth_header.split(' ')
# auth_token: ["Bearar","$token"]
# the request format not correct
if len(auth_token) != 2:
raise exceptions.AuthenticationFailed("Token is invalid")
token = auth_token[1]
try:
payload = jwt.decode(
token,settings.SECRET_KEY, algorithms="HS256"
)
username = payload['username']
user = User.objects.get(username=username)
return user, token
except jwt.ExpiredSignatureError as ex:
raise exceptions.AuthenticationFailed("Token is expired,please log in again.")
except jwt.DecodeError as ex:
raise exceptions.AuthenticationFailed("Token is invalid")
except User.DoesNotExist as no_user:
raise exceptions.AuthenticationFailed("User is not found")
```
change settings to make jwt default authentication (origenal default use OAuth2)
```
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'authentication.jwt.JWTAuthentication', #'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
]
}
```
add /authentication/views.py
```
class LoginAPIView(GenericAPIView):
authentication_classes = []
#not using the jwt authentication
#
```