2010-12-16 16 views
8

私はdjango-pistonで多くのことを読んできましたが、私が開発しているアプリケーションのAPIを作るために使っていましたが、私は世界のクライアント側でハングアップしています。ハンドラとURIのマッピングを記述しました。JSONやXMLを心のコンテンツに戻すことができます。私が立ち往生しているところは、今それをどうするかです。ジャンゴピストンクライアントを作成する正しい方法は何ですか?

私の理想的なゲームは、iPhoneとAndroidクライアントがデータを消費して返すことですが、認証を処理する正しい方法はわかりません。私が考えることができる最も簡単な方法は、デバイスにユーザー名とパスワードを保存し、それを使って各リクエストにタグを付けることです。最終的には基本認証を使用しますが、それは間違いです。私はOAuthのた​​めのピストンのサポートを見て、this tutorialの助けを借りてそれを稼いだが、それは正解のように感じられない。最終的には、ユーザー名とパスワードのための簡単なプロンプトをPistonとREST経由でDjangoに送信し、APIキーが返されるようにすることが本当に好きです。デバイスはそのキーを保存し、その後のすべてのリクエストにタグを付けます。それは正しい方法のように感じますが、私はそれを行う方法を理解することはできません。誰かが正しい方向に向けることができますか?

+0

OAuthで何が問題になるのですか? – klemens

答えて

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) 

あなたは、実際の鍵を生成するために、いくつかの方法が必要になります。ただ、APIキーのユーザ名/パスワードをスワップについては

# urls.py 

key_auth = ApiKeyAuthentication() 

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

your_handler = ProtectedResource(YourHandler) 

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) 

最後に、あなたの新しい認証バックエンドをフックアップ:このような何かがAPIKEYモデルのsave方法では、たとえば(動作しますBasicAuthenticationを使用して新しいApiKey(request.user用)を作成して返すハンドラを作成します。

+0

Brilliant。基本的には私はそれを考えていました。 ! – eddieroger

関連する問題