8

私はdjango-pistonについてよく読んでいて、開発中のアプリのAPIを作成するために使用していますが、世界のクライアント側に夢中になっています。ハンドラーと uri マッピングを作成したので、心ゆくまで JSON または XML を返すことができます。私が立ち往生しているのは、今それをどうするかです。

私の理想的な最終目標は、iPhone と Android クライアントがデータを消費して返すことですが、認証を処理する正しい方法がわかりません。私が理解できる最も簡単な方法は、ユーザー名とパスワードをデバイスに保存し、各リクエストにタグを付けて、最終的に基本認証を使用することですが、それは間違っています。私はピストンの OAuth のサポートを調べて、このチュートリアルの助けを借りてそれを機能させました、しかし、それも正しい答えのようには感じません。最終的には、デバイス上でユーザー名とパスワードを求める簡単なプロンプトを表示したいと考えています。これらは Piston と REST を介して Django に送信され、API キーが返されます。デバイスはそのキーを保存し、それ以降のすべてのリクエストにタグを付けます。それは正しい方法のように感じますが、それを行う方法がわかりません。誰でも私を正しい方向に向けることができますか?

4

1 に答える 1

22

独自の認証モジュールを作成できます。次に例を示します。

class ApiKeyAuthentication(object):

    def is_authenticated(self, request):
        auth_string = request.META.get("HTTP_AUTHORIZATION")

        if not auth_string:
            return False

        key = get_object_or_None(ApiKey, key=auth_string)

        if not key:
            request.user = AnonymousUser()
            return False

        request.user = key.user

        return True

    def challenge(self):
        resp = HttpResponse("Authorization Required")
        resp['WWW-Authenticate'] = "Key Based Authentication"
        resp.status_code = 401
        return resp

ユーザーへの API キーのマッピングを保存するモデルが必要です。

class ApiKey(models.Model):
    user = models.ForeignKey(User, related_name='keys')
    key = models.CharField(max_length=KEY_SIZE)

実際のキーを生成するには、何らかの方法が必要です。このようなものが機能します (たとえば、ApiKey モデルのsaveメソッドで:

key = User.objects.make_random_password(length=KEY_SIZE)

while ApiKey.objects.filter(key__exact=key).count():
    key = User.objects.make_random_password(length=KEY_SIZE)

最後に、新しい認証バックエンドを接続します。

# urls.py

key_auth = ApiKeyAuthentication()

def ProtectedResource(handler):
    return resource.Resource(handler=handler, authentication=key_auth)

your_handler = ProtectedResource(YourHandler)

API キーのユーザー名/パスワードの交換については、BasicAuthentication を使用して新しい ApiKey (request.user 用) を作成して返すハンドラーを作成するだけです。

于 2010-12-17T20:16:32.813 に答える