Декораторы для аутентификации с использованием oauth в Django - PullRequest
3 голосов
/ 01 мая 2020

Я пытаюсь завершить Oauth1, используя декоратор в Django. До того, как я попытался использовать декоратор, я делал это с помощью этой конечной точки oauth (которая работает нормально):

Примечание: OSCAR_CALLBACK_URL - это URL-адрес только для oauth конечной точки

def oauth(request):
    if not request.GET.get('oauth_verifier'):
        return oscar_oauth_init(request)
    else:
        res = oscar_oauth_accesstoken(request)
        return res

def oscar_oauth_init(request):
    oauth = OAuth1(OSCAR_CLIENT_ID, client_secret=OSCAR_CLIENT_SECRET)
    url=OSCAR_INIT_URL+OSCAR_CALLBACK_URL
    r = requests.get(url=url, auth=oauth)
    credentials = convert(parse_qs(r.content))
    resource_owner_key = str(credentials.get('oauth_token')[0])
    resource_owner_secret = str(credentials.get('oauth_token_secret')[0])
    verifier = oscar_oauth_auth(resource_owner_key)
    request.session['resource_owner_key'] = str(resource_owner_key)
    request.session['resource_owner_secret'] = str(resource_owner_secret)
    request.session['verifier'] = str(verifier)
    return verifier


def oscar_oauth_accesstoken(request):
    verifier = request.GET.get('oauth_verifier')
    resource_owner_key = request.GET.get('oauth_token')
    resource_owner_secret = request.session.get('resource_owner_secret')
    oauth = OAuth1(OSCAR_CLIENT_ID,
                   client_secret=OSCAR_CLIENT_SECRET,
                   resource_owner_key=resource_owner_key,
                   resource_owner_secret=resource_owner_secret,
                   verifier=verifier)

    r = requests.get(url=OSCAR_TOKEN_URL+verifier, auth=oauth)
    credentials = convert(parse_qs(r.content))
    resource_owner_key = credentials.get('oauth_token')[0]
    resource_owner_secret = credentials.get('oauth_token_secret')[0]
    request.session['resource_owner_key'] = str(resource_owner_key)
    request.session['resource_owner_secret'] = str(resource_owner_secret)
    return credentials

Эту конечную точку нужно было вызывать до других вызовов API, для которых требовался авторизация пользователя.

Сейчас я пытаюсь реорганизовать это с помощью следующего декоратора:

def oscar_login(view_func):
    def _wrapped_view_func(request, *args, **kwargs):
        if not request.GET.get('oauth_verifier'):
            return oscar_oauth_init(request)
        else:
            return oscar_oauth_accesstoken(request)
        return view_func(request, *args, **kwargs)
    return _wrapped_view_func

Я не уверен как завершить бит перенаправления с помощью декоратора. Я разрешил перенаправление на ту же конечную точку oauth (указано выше), но поток останавливается в конце конечной точки, на которую я разрешил перенаправление, и не продолжает вызов API, который должен был быть выполнен после того, как он был выполнен через декоратор. Как правильно это сделать?

1 Ответ

2 голосов
/ 05 мая 2020

Обычно в Django декоратор и аутентификация будут разделены:

Это отделяет логи приложения c от метода аутентификации, упрощая разработку, обновление и управление каждым компонентом.

...