def active_account(request): User = get_user_model() code = request.data.get('code') response = Response() User = get_user_model() if (code is None): return Response({'error': 'code not found'}, 404) digits = ActivationKeys.objects.get(code=code) if(digits is None): return Response({'error': 'invalid code'}, 401) user_is = digits.user.username active_user = User.objects.filter(username=user_is).first() if(active_user is None): return Response({'error': 'user not found'}, 404) role = RegisterationSerializer(active_user).data['role'] author = RegisterationSerializer(active_user).data['username'] access_token = generate_access_token(active_user) token_version = Token.objects.get(user=active_user) if(token_version is None): response.data = {'token_version': 'token version not exist'} refresh_token = generate_refresh_token(active_user, token_version) response.data = { 'access_token': access_token, 'role': role, 'author': author, } return response
def refresh_token_view(request): ''' To obtain a new access_token this view expects 2 important things: 1. a cookie that contains a valid refresh_token 2. a header 'X-CSRFTOKEN' with a valid csrf token, client app can get it from cookies "csrftoken" ''' User = get_user_model() refresh_token = request.COOKIES.get('refreshtoken') if refresh_token is None: raise exceptions.AuthenticationFailed( 'Authentication credentials were not provided.') try: payload = jwt.decode(refresh_token, settings.REFRESH_TOKEN_SECRET, algorithms=['HS256']) except jwt.ExpiredSignatureError: raise exceptions.AuthenticationFailed( 'expired refresh token, please login again.') user = User.objects.filter(id=payload.get('user_id')).first() if (user is None): raise exceptions.AuthenticationFailed('User not found') if not user.is_active: raise exceptions.AuthenticationFailed('user is inactive') user_token_version = Token.objects.filter(user=user).first() if user_token_version.token_version != payload.get('token_version'): raise exceptions.AuthenticationFailed( 'revoked refresh token, user not authenticated.') access_token = generate_access_token(user) return Response({'access_token': access_token})
def login_view(request): User = get_user_model() username = request.data.get('username') password = request.data.get('password') response = Response() if (username is None) or (password is None): raise exceptions.AuthenticationFailed('username and password required') user = User.objects.filter(username=username).first() if (user is None): raise exceptions.AuthenticationFailed('user not found') if (not user.check_password(password)): raise exceptions.AuthenticationFailed('wrong password') serialized_user = RegisterationSerializer(user).data['username'] access_token = generate_access_token(user) token_version = Token.objects.get(user=user) if (token_version is None): response.data = {'token_version': 'token version not exist'} refresh_token = generate_refresh_token(user, token_version) response.set_cookie(key='refreshtoken', value=refresh_token, httponly=True) response.data = { 'access_token': access_token, 'user': serialized_user, } return response
def login_view(request): User = get_user_model() username = request.data.get('username') password = request.data.get('password') response = Response() if (username is None) or (password is None): raise exceptions.AuthenticationFailed('username and password required') user = User.objects.filter(username=username).first() if (user is None): raise exceptions.AuthenticationFailed('user not found') if (not user.check_password(password)): raise exceptions.AuthenticationFailed('wrong password') role = RegisterationSerializer(user).data['role'] author = RegisterationSerializer(user).data['username'] access_token = generate_access_token(user) token_version = Token.objects.get(user=user) if (token_version is None): response.data = {'token_version': 'token version not exist'} refresh_token = generate_refresh_token(user, token_version) response.set_cookie(key='refreshtoken', value=refresh_token, httponly=True) try: headers = request.headers.items() tokens = '' for header in headers: if 'Cookie' in header: tokens = header[1] break except: tokens = 'error' response.data = { 'access_token': access_token, 'role': role, 'author': author, 'tokens': tokens } return response