在Django中使用oauth进行身份验证的装饰器

问题描述 投票:1回答:1

我正在尝试使用Django中的Decorator来完成Oauth1。直到尝试使用装饰器之前,我都是使用此端点oauth(可以正常工作)来完成它:

注意:OSCAR_CALLBACK_URL仅是oauth端点的URL

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调用。正确的做法是什么?

python django oauth python-decorators
1个回答
0
投票

通常在Django中,装饰器和身份验证是分开的:

  • 装饰器可能是内置装饰器之一,例如@login_required@login_required
  • 认证将使用@permission_required进行配置,可能是现成的(快速谷歌建议使用@permission_required

这将应用程序逻辑与身份验证方法分离开来,使每一部分都易于开发,更新和管理。

© www.soinside.com 2019 - 2024. All rights reserved.