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

Python Django中使用oauth进行身份验证的装饰器,python,django,oauth,python-decorators,Python,Django,Oauth,Python Decorators,我正在使用Django中的装饰程序来完成Oauth1。在我尝试使用decorator之前,我一直在使用这个端点oauth(工作正常): 注意:OSCAR\u CALLBACK\u URL仅为oauth端点的URL def oauth(request): if not request.GET.get('oauth_verifier'): return oscar_oauth_init(request) else: res = oscar_oauth_

我正在使用Django中的装饰程序来完成Oauth1。在我尝试使用decorator之前,我一直在使用这个端点
oauth
(工作正常):

注意:
OSCAR\u CALLBACK\u 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

我不知道如何使用decorator完成重定向位。我允许重定向到同一个端点
oauth
(上面共享),但是流在我允许重定向到的端点的末尾停止,并且不会继续通过decorator进行API调用。正确的方法是什么

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

  • 装饰器可能是内置的,例如或
  • 身份验证将使用一个,可能是一个现成的配置(谷歌建议可以快速配置)

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

为什么要使用名为
OAuth1
的东西?你提到你想要OAuth2你到底想做什么?对我来说,它看起来不像是合适的OAuth2。@VladimirSerykh:那是个打字错误。我只是想说Oauth1。我正在使用OAuth1,您绝对不应该在2020年使用OAuth1。由于安全原因,不推荐使用OAuth1。@使用OAuth1提供身份验证的VladimirSerykh外部模块