2014-02-13 3 views
0

장고 (Django) 웹 프레임 워크를 사용하여 웹 응용 프로그램을 만들었습니다. 보안을 위해 각 URL이 비밀번호로 보호되도록 미들웨어를 만들었습니다. 임의의 사람이 webapp의 URL을 입력했지만 로그인하지 않은 경우 미들웨어는 로그인 페이지로 이동합니다.장고 - URL 인증 당하나요?

이제는 더 큰 웹 응용 프로그램을 실행하는 동일한 서버로 /로부터 데이터를 게시하고 액세스하는 iOS 앱을 빌드하려고합니다. 아이디어는 iOS 앱이 서버에 URL 호출을하고 서버가 JSON 데이터를 뱉어 버릴 것이라는 것입니다. PhoneGape로 앱을 만들고 있으므로 모든 직선적 인 URL이 jQuery에서 호출됩니다.

웹 응용 프로그램에 사용자가 로그인해야하기 때문에 iOS 앱이 데이터 요청을하고 서버가 어떻게해서이 요청이 허락되었는지 확인할 수있는 방법이 필요합니다. 사용자가 로그인하지 않더라도 기본적으로 URL 별 유효성 검사의 행을 따라 (사용자를 로깅하지 않음).

내 생각 엔 최선의 방법은 동일한 미들웨어를 사용하는 것입니다.하지만 확장하여 /m/ios/으로 시작하는 모든 URL이 다르게 처리되도록하는 것이 좋습니다. 앱 측에서는 URL을 요청하면 해당 URL에 사용자의 usernamepassword을 첨부 할 수 있습니다. 따라서 미들웨어는 사용자 이름/암호를 긁어내어 유효 사용자를 확인하지만 사용자를 로그인하지 않고 단순히 요청을 수행 할 수 있습니다.

이 상황을 처리하는 논리적 방법일까요? 더 좋은 방법이 있습니까?


편집 나는/부적절 불안 무엇인지 내가 뭘


가 여기 스탠드로 내 미들웨어 파일이지만, 경우에 다르게 작동하지 않는 나는이 접근에 상당히 열려있어, 말을해야 바르게. 유효성 검사가 작동하지만 URL에 대한 최종 호출이 완료되지 않았습니다.

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(): 
       try: 
        url = request.path.split('/')[1] 
        url = url + '/' + request.path.split('/')[2] + '/' 
        print(url) 
        if url == 'm/ios/': 
         usr = request.GET['username'] 
         psw = request.GET['password'] 
         user = authenticate(username = usr, password = psw) 
         if user is not None: 
          if user.is_active: 
           # This line doesn't actually carry out the request 
           return login(request) 
         else: 
          d = {} 
          d['creds_good'] = "false" 
          json = simplejson.dumps(d) 
          GET = request.GET 
          callback = GET.get('callback') 

          if callback: 
           json = '%s(%s)' % (callback, json) 

          return HttpResponse(json, mimetype='application/json') 
       except: 
        pass 

       if request.POST: 
        return login(request) 
       else: 
        return HttpResponseRedirect('/accounts/login/?next=%s' % request.path) 
+0

ios 요청에 대해 사용자에게 로그인하지 않으려는 이유가 있습니까? – toad013

+0

로그인 할 수 있습니까? 셀 범위가있는 휴대 전화 앱에서도 로그인 할 수 있습니까? 로그인 세션은 얼마나 오래 지속됩니까? 셀 수신 감도가 떨어지는 문제가 있습니까? 기본적으로 나는 사용자의 모바일 기능을 유지하기 위해 일회성 인증을하는 것이 더 나을 것이라고 생각했다. 나는 정말로 귀하의 질문에 대한 답변을 가지고 있지 않다고 생각합니다. 단지 최선의 생각이 아닌 것으로 생각했습니다. – Garfonzo

+0

URL에 암호를 전달하는 것은 매우 안전하지 않습니다. URL 스니핑에 취약합니다. @ toad013에 언급 된대로 로그인 할 수 있으며 일반 Django 인증을 사용하는 경우 각 요청에 쿠키가 전달됩니다. – arocks

답변

1

장고에는 login_required 데코레이터가 있습니다. 특정 URL에 로그인이 필요하고 다른 사용자에게는 URL이 필요하지 않은보기에 URL을 매핑 할 수 있습니다.

+0

그러나 나는 많은 URL을 가지고 있으며 언급 한 바와 같이 담요가 필요합니다. 그래서 이것은 실제로 적용 가능하지 않습니다. – Garfonzo

0

요청 URL에 사용자 이름과 비밀번호를 넣지 않겠습니다. 그 물건은 평문으로 보일 수 있습니다. 이것은 또한 당신이 ios app 캐시의 사용자 이름과 암호라고 믿게합니다. 그 자체로 보안 위험이 있습니다.

현재 미들웨어 논리에 따르면 사용자는 여전히 로그인하고 있습니다. 또한 ios 요청에 대한 URL 당 사용자를 로그인하여 로그인/URL별로 새 세션을 만드는 것처럼 보입니다.

앱이 http 쿠키를 지원하지 않으면 somesort의 키 또는 토큰을 전달하는 것이 쿠키와 본질적으로 동일하지만 수동으로 수행하는 것이 가장 좋습니다. 나는 장고의 세션을 활용하려고 노력할 것입니다. 가능한 한. ios 앱에서 사용자 이름과 비밀번호를 수집하고 바로 로그인하십시오. 이상적으로는 오래 지속되는 세션 (https://docs.djangoproject.com/en/dev/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.set_expiry)을 ios app에 반환하며 앱은 반환 된 세션 키만 저장합니다. 다른 모든 요청에 ​​대해 사용자 이름/비밀번호 자격증 명 대신에 인증 용으로 사용할 것입니다. 전화가 세션 키를 보유하고 세션이 서버에있는 전화 상에 존재하지 않는 한 전화가 수신을 느슨하게하면 세션이 종료되지 않습니다.

가능한 경우 모든 요청 헤더 (예 : 헤더 DJANGO_SESSION_KEY)에 세션 키를 첨부합니다. 모든 유형의 요청 (POST , GET, PUT 등)

그렇다면 django의 세션 미들웨어를 확장하고 process_request 함수를 다시 작성합니다. django 버전에서 (1.5)를 사용하고 있는데, process_request 함수에서 session_key를 찾는 줄을 바꿀 것이다.

class MySessionMiddleware(SessionMiddleware):             
    def process_request(self, request):            
     engine = import_module(settings.SESSION_ENGINE)        
     session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, request.META.get('HTTP_DJANGO_SESSION_KEY')) 
     request.session = engine.SessionStore(session_key) 

그런 다음이 맞춤 확장 세션 미들웨어를 settings.py의 django 's 대신 사용합니다.

요청 미들웨어 체인의 끝에 정의 된 사용자 정의 미들웨어가 나타납니다.

def process_request(self, request):             
    if request.path != '/accounts/login/' and request.user.is_anonymous():   
     if request.META.HTTP_CONTENT_TYPE == 'application/json' or request.META.HTTP_ACCEPT == 'application/json': 
      # return json error response           
     # return error redirect