4

Djangoでフィルターされたリソースアクセス(OAuth認証)を使用してWebサービスを実装しようとしていますが、いくつか質問がありました。

2つのWebサーバーを作成しました。

OAuthのバージョン1.0aを使用して、プロバイダーに対してコンシューマーを認証しようとしています。このプロトコルのワークフローについては、ここで説明します。

簡単に言うと、さまざまな手順(交換されるリソースの名前)は次のとおりです。

  1. コンシューマープロバイダーにトークンを要求します(キー、シークレット)
  2. コンシューマーが有効な場合、プロバイダーコンシューマーにトークンを返します(oauth_token、oauth_token_secret)
  3. コンシューマーは、ユーザーをプロバイダーにリダイレクトして、ログイン/アクセスを許可します(oauth_token)
  4. ユーザーは、リソースのコンシューマーへのアクセスを許可します。
  5. プロバイダーコンシューマーにトークンベリファイア(token_verifier)を提供します
  6. コンシューマーはaccess_token(key、secret、oauth_token、oauth_token_secret、oauth_verifier)を要求します
  7. プロバイダーコンシューマーにaccess_token(oauth_token)を提供します
  8. コンシューマーは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に関する一般的な質問

  • 消費者はいくつのトークンを持っている必要がありますか?1?ユーザーごとに1つ?リソースごとに1つ?
  • 消費者はトークンをどのように保存することになっていますか?
  • コンシューマーがトークンを使用してアクセスできるリソースをどのように指定しますか?コンシューマーは、ユーザーをサービスプロバイダーにリダイレクトするときに(ステップ3)、アクセスしたいリソースのIDを提供できるべきではありませんか?
  • コンシューマーが、ユーザーが過去にアクセスを許可したリソースにアクセスしたい場合、とにかくユーザーをサービスプロバイダーにリダイレクトする必要があります(そして、サービスプロバイダーがユーザーに許可を求める代わりに、oauth_verifierを即座に返すようにします) ?

技術的な問題

現在、トークンを保存するためにローカルメモリキャッシュセッションを使用していますが、機能しません。

  • コンシューマーサーバーでセッションがアクティブ化されると、ユーザーはサービスプロバイダーサーバーに毎回ログインする必要があります(既にログインしている場合でも)。
  • 最初のビュー(トークンのリクエスト)では、oauth_tokenoauth_token_secretをリクエストのセッションに保存します。(ユーザーをリダイレクトする前に)2番目のビューでアクセスしようとすると、機能します。しかし、最後のビュー(リダイレクト後)でアクセスしようとすると、アクセスしません(KeyError、辞書oauth_tokenに見つかりません)request.session

ありがとうございました!

4

1 に答える 1

1

私は同じような船に乗っています (OAuth 認証を使用して API を実装しています)、私の研究でdjango-oauth-plusプロジェクトに出会いました。このチュートリアルでは、リンク先の図で概説されているプロセスの各ステップを順を追って説明しています。コード自体は、OAuth のかなり完全な実装のようです (私が話していることを知っているかどうかはわかりませんが、このことを学んでいます)。

また、この人には OAuth の基本に関する非常に優れたチュートリアルがあります (私はそれに苦労しました)。

于 2011-07-05T18:22:35.490 に答える