0

ORM 以外のデータ ソースで Django を使用しようとしています。認証なしでカスタム バックエンドを介して他のリソースにアクセスすることはできますが、ユーザー認証を導入する必要があります。ローカル データベースはありません。リクエスト (たとえば、ユーザー名とパスワードで作成された cURL コマンド) を受け取ると、リモート URL に対して HTTP 基本認証を実行する必要があり、成功すると、ローカルで作成されたユーザー オブジェクトを返す必要があります。 . Tastypie のリソースで、次のように書きました。

class dict2obj(object):
    """
    Convert dictionary to object
    @source http://stackoverflow.com/a/1305561/383912
    """
    def __init__(self, d):
        self.__dict__['d'] = d

    def __getattr__(self, key):
        value = self.__dict__['d'][key]
        if type(value) == type({}):
            return dict2obj(value)
        return value


class RemoteAuth(Authentication):
    def is_authenticated(self, request, **kwargs):
        username = request.user.username
        password = request.user.password
        r = requests.get(AUTHENTICATION_URL, auth=(username, password))
        if r.status_code == 200:
          return True
        return False



class UserResource(Resource):             
    username = fields.CharField(attribute='username')

    class Meta:
        resource_name = 'user'
        authentication = RemoteAuth()
        authorization = Authorization()

        def obj_get_list(self, request=None, **kwargs):

            result = []

            posts.append(dict2obj(
            {
            'username': request.POST.get('username'),
            }
            ))

            return result   

しかしもちろん、認証オブジェクトはそのようなパスワードを取得できないため、これは機能しません。ローカルデータベースを使用せずにユーザー認証を削除する良い方法を提案してください。

4

1 に答える 1

0

実際のデータを保存せずにユーザー認証を行いたい場合はsession、最後の手段として or を使用できますcookies。セッション データは暗号化され、セッション Cookie 自体またはサイド Cookie 内に保存される可能性があります。

それはどのように機能しますか?

ユーザー認証/ログインを処理api/v1/user/loginする方法として、たとえば、エンドポイントを作成できます。UserResource次のように行うことができます。

def override_urls(self):
    return [
        url(r"^(?P<resource_name>%s)/login%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('user_login'), name="api_user_login"),
    ]

def user_login(self, request, **kwargs):
    # Authentication process happens here.
    return self.create_response(request, {})

上記を機能させるには、インポートする必要がtastypie.utils.trailing_slashありdjango.conf.urls.urlます。残念ながら、tastypie は URL をより簡単に作成するためのヘルパー メソッドをサポートしていません。

このuser_loginメソッドでは、リモート エンドポイントに対して渡された資格情報を認証しPOST、ユーザー名とパスワードをrequest.sessionリモート認証エンドポイント固有のデータと共に保存します。で、RemoteAuthenticationセッション キーの存在を確認できます。

セッションがローカル ファイル システム内のデータである場合、内部のデータはもう少し安全であると見なすことができます。セッション データを暗号化された Cookie に保存する場合は、各セッション キーの値とチェックサムを、おそらく単一の Cookie エントリまたは個別の Cookie エントリに保存する必要があります。

ユーザーは資格情報をプレーン テキストで渡してログインするuser_loginため、SSL 経由でビューを提供することを検討できます (Cookie がそうでないことを確認してくださいsecure_only)。

于 2013-10-09T15:42:38.067 に答える