6

content-typeto以外のヘッダーを設定せずに、GET を実行して SessionAuthentication と Tastypie を操作できますapplication/json。ただし、ヘッダーの Cookie にセッション ID がある場合でも、HTTP POST は失敗します。401 AuthorizationHeader で失敗しますが、Authorization とは関係ありません。SessionAuthentication を BasicAuthentication に変更し、ユーザー名/パスワードを渡すことも機能します。

Tastypie で POST を使用するために SessionAuthentication を使用したことのある人はいますか?

4

3 に答える 3

10

はい、動作しました。あなたがする必要があるのはcsfrトークンを渡すことです:

SessionAuthentication

この認証スキームは、組み込みのDjangoセッションを使用して、ユーザーがログに記録されているかどうかを確認します。これは通常、APIがホストされているのと同じサイトでJavascriptによって使用される場合に役立ちます。

ユーザーがログインし、アクティブなセッションを持っている必要があります。また、有効なCSRFトークンが必要です

これは、jQueryでそれを行う方法です。

// sending a csrftoken with every ajax request
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    crossDomain: false, // obviates need for sameOrigin test
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
        }
    }
});

$.ajax({
    type: "POST",
    // ...

と書かれている部分に注目してください$.cookie('csrftoken')。Djangoが設定したCookieからcsrfトークンを取得します。

アップデート:

DjangoがFirefoxとOperaでCookieを設定しないという問題がありました。テンプレートタグ{% csrf_token %}をテンプレートに入れると、これが解決します。正しい解決策は、おそらくデコレータを使用することensure_csrf_cookie()です。

于 2013-03-13T17:53:39.837 に答える
-1

これはtastypieのソースコードで見つかりました。基本的に、HTTPPOSTがSessionAuthenticationでサポートされていないことを意味します。

class SessionAuthentication(Authentication):
    """
    An authentication mechanism that piggy-backs on Django sessions.

    This is useful when the API is talking to Javascript on the same site.
    Relies on the user being logged in through the standard Django login
    setup.

    Requires a valid CSRF token.
    """
    def is_authenticated(self, request, **kwargs):
        """
        Checks to make sure the user is logged in & has a Django session.
        """
        # Cargo-culted from Django 1.3/1.4's ``django/middleware/csrf.py``.
        # We can't just use what's there, since the return values will be
        # wrong.
        # We also can't risk accessing ``request.POST``, which will break with
        # the serialized bodies.
        if request.method in ('GET', 'HEAD', 'OPTIONS', 'TRACE'):
            return request.user.is_authenticated()

だからここで私自身の質問に答えますが、誰かがそれをよりよく説明し、これを行うための良い方法を提案することができれば、それも素晴らしいでしょう。

編集

現在、https://github.com/amezcua/TastyPie-DjangoCookie-Auth/blob/master/DjangoCookieAuth.pysession_idの回避策を使用しています。これは、基本的にCookieからを取得し、バックエンドで確認するカスタム認証スキームです。認証されます。最も完全な証明ソリューションではないかもしれませんが、うまく機能します。

于 2013-03-13T16:25:32.743 に答える