3

Tastypie を使用して API を作成しています。次の関数を使用してログインしています

def signin(self, request, **kwargs):
        self.method_check(request, allowed=['post'])
        data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json'))
        username = data.get('username', '')
        password = data.get('password', '')
        try:
            user = User.objects.get(username=data.get('username', ''))
            if user.get_profile().status == 3 or user.get_profile().status == 4:
                return self.create_response(request, {'success': False, 'reason': 'Account Disabled or Closed' })
            user = authenticate(username=username, password=password)
            if user:
                if user.get_profile().status == 2:
                    return self.create_response(request, {'success': True,'is_verified':False })
                return self.create_response(request, {'success': True,'is_verified':True })
            else:
                return self.create_response(request, {'success': False, 'reason': 'Wrong Email or Password' })
        except User.DoesNotExist:
            return self.create_response(request, { 'success': False, 'reason':'Email not registered' })

しかし、jQueryを使用してログインすると

<script type="text/javascript">
            $(document).ready(function() {
                $( "#signin" ).click(function() {
                    var username=$("#inputEmail1").val();
                    var password=$("#inputPassword1").val();
                    if (username.length == 0 || password.length == 0) {
                        alert('enter email and password to login.')
                    }else{
                        $.ajax({
                            type: "POST",
                            url: "/api/v1/user/signin/",
                            data: JSON.stringify({ 'username':username,'password':password }),
                            contentType: "application/json; charset=utf-8",
                            dataType: "json",
                            success: function(data, status, xhr){
                                $.cookie();
                                if (data.success){
                                    if (data.is_verified) {
                                        alert('Logged in and is_verified');
                                    }else{
                                        alert('Logged in but not verified');
                                    }
                                }else{
                                    alert('Incorrect username or password');
                                }
                            },
                            failure: function(errMsg) {
                                alert(errMsg);
                            }
                        });
                    };
                });
            })
        </script>

しかし、 $.cookie(); でクッキーを取得しようとすると firebug では ( jquery-cookieを使用)、空のオブジェクト (Object {}) を返します

私は何かを逃していますか?何かを追加する必要がありますか?これは iOS で問題なく動作します。何らかの方法で Cookie をフェッチし、セッションを記憶します。しかし、ここではありません。

4

1 に答える 1

1

signinメソッドは Cookie を設定していないため、jQuery がアクセスできる Cookie はありません。これが iOS でどのように機能しているかはわかりません (別のセッションまたは手動ログインからの残りの Cookie ですか?) が、iOS へのトラフィックをスニッフィングするときに Set-Cookie ヘッダーが表示されない限り、問題はsignin.

Django でセッション Cookie を設定するには、保存する値を次のように追加する必要がありますrequest.session

request.session['success'] = true
return self.create_response(request, {'success': True,'is_verified':False })

ちなみに、攻撃者がユーザー名がシステムで有効かどうかを判断できるため、このコードには情報漏えいの脆弱性もあります。通常、login関数は無効なユーザー名または無効なパスワードに対して同じエラーを (同時に) 返す必要があります。

于 2013-09-25T09:29:47.337 に答える