2017-10-13 7 views
0

cURL 및 Postman으로 Django 휴식 API를 테스트하는 데 문제가 있습니다. 내 클래스 뷰에 대한 액세스를 제한 할 LoginRequiredMixin을 사용하고 있습니다 :CURL과 Postman이 LoginRequiredMixin을 사용하여 Django 휴식 API에 액세스 할 수 없습니다.

class UserList(LoginRequiredMixin, generics.ListCreateAPIView): 
    model = User 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

를 권한이없는 사용자가 자신이 로그인 페이지로 리디렉션됩니다 페이지에 액세스하려고 할 때. URL에서 사용자가 권한 부여 직후에 원하는 페이지를 볼 수 있도록 다음 매개 변수가 있습니다.

/accounts/login/?next=/users/ 

문제 컬 및 우편 배달부가 아마 인증을 위해 사용자 이름과 암호를 제공 사용하지 않고 바로 결과로 반환되는 로그인 페이지로 리디렉션되는 것입니다.

다음은 예제 또는 cURL 명령입니다. 사용자 이름과 암호가 제공 되더라도 결과는 302입니다. 다음 리디렉션에 -L 매개 변수를 추가하면 로그인 페이지의 응답이 반환되고 원래 페이지로 리디렉션되지 않습니다.

curl -i -L -u superadmin:superadmin http://127.0.0.1:8000/users/ 
HTTP/1.0 302 Found 
Date: Fri, 13 Oct 2017 10:16:31 GMT 
Server: WSGIServer/0.2 CPython/3.5.2 
Vary: Cookie 
Content-Length: 0 
Content-Type: text/html; charset=utf-8 
Location: /accounts/login/?next=/users/ 
X-Frame-Options: SAMEORIGIN 

HTTP/1.0 200 OK 
Date: Fri, 13 Oct 2017 10:16:31 GMT 
Server: WSGIServer/0.2 CPython/3.5.2 
Vary: Cookie 
Content-Length: 1128 
Content-Type: text/html; charset=utf-8 
Cache-Control: max-age=0, no-cache, must-revalidate, no-store 
X-Frame-Options: SAMEORIGIN 
Expires: Fri, 13 Oct 2017 10:16:31 GMT 
Set-Cookie: csrftoken=cCfAfsSlHOZEQGvPD1RR33r1UXj6JtEscWKFjmVyHmvVasqMx2J0pqyeNbVpY3X9; expires=Fri, 12-Oct-2018 10:16:31 GMT; Max-Age=31449600; Path=/ 

<html> 
    <head> 
     <title>Login</title> 
    </head> 
    <body> 
     <h1>Login</h1> 

     <form method="post" action=""> 
      <table> 
       <tr> 
        <td><label for="id_username">Username:</label></td> 
        <td><input type="text" name="username" id="id_username" autofocus maxlength="254" required /></td> 
       </tr> 
       <tr> 
        <td><label for="id_password">Password:</label></td> 
        <td><input type="password" name="password" id="id_password" required /></td> 
       </tr> 
       <tr> 
        <td colspan="2"> 
         <input type="submit" value="Login" /> 
         <input type="hidden" name="next" value="/private/meals/" /> 
         <input type='hidden' name='csrfmiddlewaretoken' value='Pd3g7jmZ0WAACWihmRxNGvLF2wy5yzP9Pxylbdpc0u6RWIdegSpW2SSSVKaoN98Q' /> 
        </td> 
       </tr> 
      </table> 
     </form> 

     <p><a href="/accounts/signup/">Sign up</a></p> 
    </body> 
</html> 

here 제안대로 쿠키 저장 및로드를 시도했지만 작동하지 않습니다. cURL과 Postman에서 LoginRequiredMixin을 전달할 방법이 있습니까? 또는 Django Rest Framework에서 Rest API 테스터와 함께 사용할 수있는 적절한 액세스 제한 방법은 무엇입니까?

는 당신에게 감사

답변

0

당신이 -e 옵션을 사용하려고 했습니까?

-e, --referer <URL> 

    (HTTP) Sends the "Referrer Page" information to the HTTP server. This can also be set with the -H, --header flag of course. When used with -L, --location you can append ";auto" to the -e, --referer URL to make curl automatically set the previous URL when it follows a Location: header. The ";auto" string can be used alone, even if you don't set an initial -e, --referer. 

    If this option is used several times, the last one will be used. 

    See also -A, --user-agent and -H, --header. 
+0

불행히도 도움이되지 않습니다. 다른 브라우저에서는 다른 코드를 사용하지 않고 사용자가 어디에서 왔는지 확인하지 않습니다. --header 옵션을 사용하는 방법이나 도움이되는 방법을 잘 모르겠습니다. 나는 cURL과 Postman이 제공된 인증을 사용하지 않고 Django의 LoginRequiredMixin에 의해 즉시 리디렉션된다고 생각하기 시작합니다. 나는 장고에서 다른 좋은 액세스 제한이 있는지 잘 모르겠다. –

+0

저장 쿠키가 작동하지 않는다고하셨습니까? as : curl -X POST -d "username = superadmin & password = superadmin"-c login http : // localhost : 8000/accounts/login; curl -b login http : // localhost : 8000/users/ – efkin

+0

와우. 작은 수정으로 실제로 작동합니다. 로그인 페이지로 데이터를 로깅 한 후 "403 Forbidden - CSRF 확인에 실패했습니다. 요청이 중단되었습니다." 메시지. 내가 로그인 페이지에서 csrf 토큰을 올바르게 설정했기 때문에 이상하게 보입니다.그럼에도 불구하고 나는 csrf를 curl 명령에 매개 변수로 설정하려고 시도했다. [here] (https://stackoverflow.com/questions/10628275/how-to-use-curl-with-django-csrf-tokens-and-post-requests) 그리고 효과가있었습니다.
우편 배달부와 함께하는 방법을 알고 계십니까? 또한 답으로 게시 할 수도 있습니다. 나는 그것을 할 것이나, 당신의 신용을 가지고 가고 싶지 않다. –

1

curl manpage에서 당신은 적절한 인증 메커니즘을 사용해야합니다. 당신이 사용하고있는 무엇이 AUTHENTICATION_BACKEND을 확인해야합니다. 대부분 세션 기반 인증을 사용하게 될 것입니다. 즉, 인증 된 세션을 포함하는 Postman에 쿠키를 추가해야합니다.

쿠키를 얻으려면 Chrome을 통해 웹 사이트에 로그인하고 Developer Tools -> Storage -> Cookies을여십시오. Domain을 찾고 NameValue을 도메인의 Postman app -> Cookies -> Manage Cookies에 복사하십시오.

인증을 수행하는 데 적합한 REST API 방법이 아닙니다. Postman은 Basic Auth (사용자 이름/비밀번호로 시도한 것), OAuth, Digest Auth 및 기타 여러 기술과 같은 varied authentication mechanisms을 지원합니다. 백엔드 용 REST API를 빌드하려는 경우 Django REST Framework 또는 Django Tastypie과 같은 Django API 프레임 워크를 사용하는 것이 좋습니다.