【问题标题】:Decorators for authentication using oauth in Django在 Django 中使用 oauth 进行身份验证的装饰器
【发布时间】:2020-08-15 11:59:05
【问题描述】:

我正在尝试使用 Django 中的装饰器来完成 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 调用。正确的方法是什么?

【问题讨论】:

  • 你为什么使用名称为OAuth1的东西?你提到你想要 OAuth2
  • 你到底想做什么?对我来说,它看起来不像是正确的 OAuth2。
  • @VladimirSerykh:这是一个错字。我只想说 Oauth1。我正在使用 Oauth1
  • 你绝对不应该在 2020 年使用 OAuth1。出于安全原因,OAuth1 已被弃用。
  • @VladimirSerykh 使用 Oauth1 提供身份验证的外部模块

标签: python django oauth python-decorators


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 2015-08-30
    • 1970-01-01
    • 2011-10-20
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多