2014-08-29 2 views
1

전체 사이트에서 인증을 요구하는 Django 웹 응용 프로그램이 있습니다. 필자는 기본적으로 request.user.is_anonymous을 테스트하는 맞춤형 미들웨어로이를 수행했으며, 그렇다면 로그인 페이지로 리디렉션합니다. 그것은 다음과 같습니다Django, TastyPie, 인증 및 맞춤형 미들웨어 두통

from django.contrib.auth.views import login 
from django.contrib.auth import authenticate 
from django.http import HttpResponseRedirect, HttpResponse 
from django.utils import simplejson 
from django.core import serializers 

class SiteLogin: 
    "This middleware requires a login for every view" 
    def process_request(self, request): 
     if request.path != '/accounts/login/' and request.user.is_anonymous(): 
      if request.POST: 
       return login(request) 
      else: 
       return HttpResponseRedirect('/accounts/login/?next=%s' % request.path) 

가 지금은 지금, 바로 장고 서버의 전원 요청을 얻는 것, 아이폰 OS 응용 프로그램을 만들고있어. 나는 이것을하기 위해 TastyPie를 사용하려하지만 인증 작업을 할 수 없다. 나는 ApiKeyAuthentication을 사용하고 있으며, 올바르게 설정했다고 생각합니다. 그러나, 그냥 로그인 페이지로 리디렉션됩니다. TastyPie 요청을 처리하기 위해이 미들웨어를 편집해야하는지 궁금 해서요.하지만 TastyPie가 저를 위해 인증 해 줄 수 있다고 생각했습니다 ...

내 상황이 this question과 매우 유사하다고 생각하지만 내 맞춤 미들웨어 가는 중이다. 여기

입니다 내 api.py :

from django.contrib.auth.models import User 
from django.db import models 
from tastypie.resources import ModelResource 
from cpm.systems.models import System 
from cpm.products.models import Product 
from tastypie.models import create_api_key 
from tastypie.authentication import ApiKeyAuthentication 
from tastypie.authorization import DjangoAuthorization, Authorization 

models.signals.post_save.connect(create_api_key, sender=User) 



class SystemResource(ModelResource): 
    class Meta: 
    queryset = System.objects.all() 
    resource_name = 'system' 
    authentication = ApiKeyAuthentication() 
    authorization = DjangoAuthorization() 


class ProductResource(ModelResource): 
    class Meta:  
    queryset = Product.objects.all() 
    resource_name = 'product' 
    authentication = ApiKeyAuthentication() 
    authorization = DjangoAuthorization() 

과의 일부 내 urls.py :

http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345?format=json 

하지만 난 그냥 해요 :

from cpm.ios.api import SystemResource, ProductResource 
from tastypie.api import Api 

v1_api = Api(api_name='v1') 
v1_api.register(SystemResource()) 
v1_api.register(ProductResource()) 

admin.autodiscover() 

urlpatterns = patterns('', 

    # iOS TastyPie related: 
    (r'^ios/', include(v1_api.urls)), 
    # .... more urls.... 

나는 이동하려고하는 URL에있다 내 로그인 페이지로 리디렉션되었습니다. 내가 자습서를 따라 티에, 내 관리자 패널에 API 키를 만든, 그리고 내 아파치 설정에 WSGIPassAuthorization On을 추가했습니다.

아이디어가 있으십니까?

편집 난 그냥 모두 미들웨어를 제거하고 지금은받을 수는 모두 2 내가 다음 ?format=json을 제거하면 내가 얻을 것을 지적한다 (401) 인증 오류 ...

편집은 응답 : Sorry, not implemented yet. Please append "?format=json" to your URL.. 따라서 인증을 받았지만 형식을 지정하지 않았기 때문에 실패합니다.

내 URL은 다음과 같습니다. http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345하지만 ?format=JSON을 추가하면 바로 401 오류가 발생합니다.

+1

Re : format = JSON. 쿼리 문자열에 쌍을 추가 할 때? 처음에만 사용됩니다. 나머지 쌍은 &로 구분됩니다. 그래서 쿼리 문자열/URL은 다음과 같아야합니다. http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345&format=JSON – dekomote

+0

@dekomote - WOW - 그게 효과가 있습니다! 좋아요, 그래서 저는 좀 더 가깝습니다. 필자는 사용자 정의 미들웨어를 사용하지 않는 한 실제로 실제로 인증 할 수 있습니다. 그래서 이것은 좋은 진전입니다. 그래서이 질문의 후반부는 여전히 있습니다 - 내 미들웨어.py (질문에 표시된)가 이제 방해 받고 있습니다. 나는 그것을 잘못 설정 했습니까? TastyPie가 나를 위해 탐색/인증하고 미들웨어를 우회 할 수 있어야합니까? – Garfonzo

답변

2

TastyPie 요청은 일반 Django 요청과 동일한 미들웨어 스택을 통과합니다. 그래서, 그것은 확실히 당신의 미들웨어입니다. 다시 생각해 보시거나 기본에 빠져서 @login_required를 사용하십시오.

URL이 잘못되어 미들웨어를 사용 중지 한 후에도 api 키가 작동하지 않습니다. 당신은 사용할 수 없습니까? 한 번 사용한 후 쿼리 링에서 이 URL을 사용해보십시오.

http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345&format=JSON 
+0

그래, 이건 내 문제, 잘못된 URL입니다. 그래서 저는 많은 의견을 가지고 있습니다 (큰 회사 사이트입니다). tastypie가 그것을 할 수있게하기 위해'@ login_required '를 사용하여 * all *을 꾸밀 필요가 있다는 것을 의미합니까? – Garfonzo

+0

글쎄, 당신은 많은 방법으로 갈 수있다 : 클래스 기반 뷰를 사용한다면, 그것을 처리 할 믹스 인을 추가 할 수있다. 미들웨어를 추가 할 수 있지만 요청이 tastypie보기로가는 경우 확인 ... – dekomote

+0

괜찮아요, 멋지다, 생각할 무언가. 적어도 내 문제의 근본 원인을 파악하고 해결하기위한 좋은 접근 방식을 결정할 수 있습니다. 당신의 도움을 주셔서 감사합니다! 나는 지난 48 시간 동안 머리카락을 꺼내왔다! – Garfonzo