gpt4 book ai didi

django - OAuth Web 服务和 Django-piston

转载 作者:行者123 更新时间:2023-12-05 00:56:24 24 4
gpt4 key购买 nike

我正在尝试使用 Django 实现具有过滤资源访问(OAuth 身份验证)的 Web 服务,但我有几个问题。

我创建了两个网络服务器:

  • http://localhost:8080 : 网络服务提供者(使用 django-piston 提供网络服务)
  • http://localhost:8000 : 网络服务消费者

  • 我正在尝试使用 1.0a 版的 OAuth 来针对提供者对消费者进行身份验证。该协议(protocol)的工作流程描述为 here .

    简而言之,以下是不同的步骤(交换的资源的名称):
  • 消费者 请求 token 供应商 ( key , secret )
  • 如果 消费者 有效,供应商 返回一个 token (oauth_token, oauth_token_secret)
  • 消费者 将用户重定向到 供应商 登录/授予访问权限 (oauth_token)
  • 用户 授予消费者对资源的访问权限。
  • 供应商 给出 消费者 token 验证器 (token_verifier)
  • 消费者 请求 access_token (key, secret, oauth_token, oauth_token_secret, oauth_verifier)
  • 供应商 给出 消费者 一个 access_token (oauth_token)
  • 消费者 使用它的 oauth_token 访问资源

  • 这是我的消费者意见的代码:
    from django.shortcuts import render_to_response
    from django.http import HttpResponse, HttpResponseRedirect
    import oauth2 as oauth
    import urlparse

    REQUEST_TOKEN_URL = 'http://127.0.0.1:8080/api/authentication/request_token/'
    AUTHORIZATION_URL = 'http://127.0.0.1:8080/api/authentication/authorize/'
    ACCESS_TOKEN_URL = 'http://127.0.0.1:8080/api/authentication/access_token/'
    CONSUMER_CALLBACK_URL = 'http://127.0.0.1:8000/request_access_token/'

    CONSUMER_KEY = 'key'
    CONSUMER_SECRET = 'secret'

    consumer = oauth.Consumer(CONSUMER_KEY, CONSUMER_SECRET)
    client = oauth.Client(consumer)

    def request_token(request):
    """
    Contacts the service provider to get a token.
    """
    resp, content = client.request(REQUEST_TOKEN_URL, 'GET')
    oauth_token = dict(urlparse.parse_qsl(content)).get('oauth_token', None)
    oauth_token_secret = dict(urlparse.parse_qsl(content)).get('oauth_token_secret',
    None)

    if oauth_token is None:
    return render_to_response('home.html', {'data': 'NO TOKEN FOUND'})
    else:
    request.session['oauth_token'] = oauth_token
    request.session['oauth_token_secret'] = oauth_token_secret
    return HttpResponseRedirect('request_user_permission/')

    def request_user_permission(request):
    """
    Redirects the user to the service provider to get permission if
    token provided.
    """
    oauth_token = request.session['oauth_token']

    if oauth_token is None:
    return render_to_response('home.html', {'data': 'NO TOKEN FOUND'})
    else:
    return HttpResponseRedirect("%s?oauth_token=%s&oauth_callback=%s"
    % (AUTHORIZATION_URL, oauth_token, CONSUMER_CALLBACK_URL))


    def request_access_token(request):
    """
    Requests an access token from the service provider
    if the user granted permission.
    """
    error = request.GET.get('error', None)

    if error is None:
    oauth_verifier = request.GET.get('oauth_verifier', None)

    if oauth_verifier is None:
    return render_to_response('home.html',
    {'data': 'UNKNOWN ERROR HAPPENED'})
    else:
    # User permission granted, requesting access token
    oauth_token = request.session['oauth_token']
    oauth_token_secret = request.session['oauth_token_secret']

    token = oauth.Token(oauth_token, oauth_token_secret)
    token.set_verifier(oauth_verifier)
    client.token = token

    resp, content = client.request(ACCESS_TOKEN_URL, 'POST')
    access_token = dict(urlparse.parse_qsl(content))
    return render_to_response('home.html', {'data': access_token})
    else:
    return render_to_response('home.html', {'data': error})

    一般 OAuth 问题
  • 消费者应该拥有多少代币?一?每个用户一个?每个资源一个?
  • 消费者应该如何存储其 token ?
  • 您如何指定消费者可以使用其 token 访问哪些资源?在将用户重定向到服务提供者(第 3 步)时,消费者是否应该能够提供它想要访问的资源的 ID?
  • 如果消费者想要访问用户过去已经授予访问权限的资源,它是否应该将用户重定向到服务提供者(并让服务提供者立即返回 oauth_verifier,而不是向用户征求许可) ?

  • 技术问题

    现在,我正在使用本地内存缓存 session 来存储 token ,但它不起作用:
  • 当 session 在消费者服务器上激活时,用户每次都必须在服务提供者服务器上登录(即使他已经登录)。
  • 在第一个 View (请求 token )中,我存储了 oauth_tokenoauth_token_secret在请求的 session 中。当我尝试在第二个 View 中访问它时(在重定向用户之前),它可以工作。但是当我尝试在最后一个 View 中访问它时(重定向之后)它没有(KeyErroroauth_tokenrequest.session 字典中找不到)

  • 谢谢!

    最佳答案

    我在同一条船上(使用 OAuth 身份验证实现 API),我遇到了 django-oauth-plus我的研究项目。本教程很好地完成了您链接到的图表中概述的过程的每个步骤。代码本身似乎是 OAuth 的一个非常完整的实现(不确定我是否知道我在说什么,只是学习这些东西)。

    另外,this guy有一个关于 OAuth 基础知识的非常棒的教程(我对此感到很困惑)。

    关于django - OAuth Web 服务和 Django-piston,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5639533/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com