From a71d4d4327b91017215cf0c9913840d43cb00a8a Mon Sep 17 00:00:00 2001 From: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> Date: Tue, 3 Dec 2019 10:56:02 +0300 Subject: [PATCH] Token auth for non-REST API apps (#889) * Token authorization for non REST API apps (e.g. git, tf annotation, tf segmentation) --- cvat-ui/src/utils/plugin-checker.ts | 42 +++++++++++--------------- cvat/apps/authentication/decorators.py | 7 +++++ 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/cvat-ui/src/utils/plugin-checker.ts b/cvat-ui/src/utils/plugin-checker.ts index fb28e9fb..0a6a6a2f 100644 --- a/cvat-ui/src/utils/plugin-checker.ts +++ b/cvat-ui/src/utils/plugin-checker.ts @@ -7,42 +7,34 @@ const core = getCore(); class PluginChecker { public static async check(plugin: SupportedPlugins): Promise { const serverHost = core.config.backendAPI.slice(0, -7); + const isReachable = async (url: string): Promise => { + try { + await core.server.request(url); + return true; + } catch (error) { + if (error.code === 404) { + return false; + } + + throw error; + } + }; switch (plugin) { case SupportedPlugins.GIT_INTEGRATION: { - const response = await fetch(`${serverHost}/git/repository/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/git/repository/meta/get`); } case SupportedPlugins.AUTO_ANNOTATION: { - const response = await fetch(`${serverHost}/auto_annotation/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/auto_annotation/meta/get`); } case SupportedPlugins.TF_ANNOTATION: { - const response = await fetch(`${serverHost}/tensorflow/annotation/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/tensorflow/annotation/meta/get`); } case SupportedPlugins.TF_SEGMENTATION: { - const response = await fetch(`${serverHost}/tensorflow/segmentation/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/tensorflow/segmentation/meta/get`); } case SupportedPlugins.ANALYTICS: { - const response = await fetch(`${serverHost}/analytics/app/kibana`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/analytics/app/kibana`); } default: return false; diff --git a/cvat/apps/authentication/decorators.py b/cvat/apps/authentication/decorators.py index dc0b107f..4557fd20 100644 --- a/cvat/apps/authentication/decorators.py +++ b/cvat/apps/authentication/decorators.py @@ -10,6 +10,7 @@ from django.shortcuts import resolve_url, reverse from django.http import JsonResponse from django.contrib.auth.views import redirect_to_login from django.conf import settings +from rest_framework.authentication import TokenAuthentication def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None, redirect_methods=['GET']): @@ -19,6 +20,12 @@ def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, if request.user.is_authenticated: return view_func(request, *args, **kwargs) else: + tokenAuth = TokenAuthentication() + auth = tokenAuth.authenticate(request) + if auth is not None: + request.user = auth[0] + return view_func(request, *args, **kwargs) + if request.method not in redirect_methods: return JsonResponse({'login_page_url': reverse('login')}, status=403)