|
43 | 43 | from oidc_auth.authentication import JSONWebTokenAuthentication
|
44 | 44 |
|
45 | 45 | from nav.models import manage, event, cabling, rack, profiles
|
| 46 | +from nav.models.api import JWTRefreshToken |
46 | 47 | from nav.models.fields import INFINITY, UNRESOLVED
|
47 | 48 | from nav.web.servicecheckers import load_checker_classes
|
48 | 49 | from nav.util import auth_token
|
@@ -1064,6 +1065,33 @@ class RackViewSet(NAVAPIMixin, viewsets.ReadOnlyModelViewSet):
|
1064 | 1065 | search_fields = ['rackname']
|
1065 | 1066 |
|
1066 | 1067 |
|
| 1068 | +class JWTRefreshViewSet(APIView): |
| 1069 | + """ |
| 1070 | + Accepts a valid refresh token. |
| 1071 | + Returns a new refresh token and an access token. |
| 1072 | + """ |
| 1073 | + |
| 1074 | + def post(self, request): |
| 1075 | + try: |
| 1076 | + db_token = JWTRefreshToken.objects.get( |
| 1077 | + token=request.data.get('refresh_token') |
| 1078 | + ) |
| 1079 | + except JWTRefreshToken.DoesNotExist: |
| 1080 | + return Response("Invalid token", status=status.HTTP_403_FORBIDDEN) |
| 1081 | + if not db_token.is_active(): |
| 1082 | + return Response("Inactive token", status=status.HTTP_403_FORBIDDEN) |
| 1083 | + token_data = db_token.data() |
| 1084 | + access_token = JWTRefreshToken.generate_access_token(token_data) |
| 1085 | + refresh_token = JWTRefreshToken.generate_refresh_token(token_data) |
| 1086 | + db_token.token = refresh_token |
| 1087 | + db_token.save() |
| 1088 | + response_data = { |
| 1089 | + 'access_token': access_token, |
| 1090 | + 'refresh_token': refresh_token, |
| 1091 | + } |
| 1092 | + return Response(response_data) |
| 1093 | + |
| 1094 | + |
1067 | 1095 | def get_or_create_token(request):
|
1068 | 1096 | """Gets an existing token or creates a new one. If the old token has
|
1069 | 1097 | expired, create a new one.
|
|
0 commit comments