2014-11-21 5 views
0

다음 Laravel 토큰 API 자습서 (http://rjv.im/post/95988160186/api-token-authentication-with-laravel-and-sentry-part)를 따랐습니다. 내 API와 통신하려면 다음 CRURL 요청을 작성했습니다.Laravel API cURL Python 요청

curl -H "X-Auth-Token:tokenhere" http://localhost:8000/account 

요청이 올바르게 작동하고 예상되는 데이터를 정확하게 반환합니다. 내가 파이썬이 번역하면 내가 대신 X-인증 토큰의 기본 인증을 사용하여 사용자 자격 증명을 전달하면 내가 urllib2.HTTPError: HTTP Error 401: Unauthorized

import urllib2 
req = urllib2.Request('http://localhost:8000/account') 
req.add_header("X-Auth-Token", "tokenhere") 
resp = urllib2.urlopen(req) 
content = resp.read() 
print content 

을받을 요청은 예상대로 작동합니다

import urllib2 

def basic_authorization(user, password): 
    s = user + ":" + password 
    return "Basic " + s.encode("base64").rstrip() 

req = urllib2.Request("http://localhost:8000/account", headers = { "Authorization": basic_authorization("usernameHere", "passwordHere"), }) 

f = urllib2.urlopen(req) 

print f.read() 

어떤 도움이 될 것이다 매우 감사.

+0

먼저, 서버 측에서'X-Auth-Token' 헤더를 어떻게 파싱하고 있습니까? 일반적으로 헤더는 콜론 다음에 공백으로 전송되므로 'curl'이 헤더의 나머지 부분을 보내는 방법과 'urllib2'가 추가 한 헤더를 포함하여 _all_ 헤더를 보내는 방법입니다. 서버가 실제로''X-Auth-Token : tokenhere''을 기대하고''X-Auth-Token : tokenhere''을 거부한다면, 서버 측에서 수정해야 할 버그입니다. – abarnert

+0

둘째로, 이것을 디버깅하려면, 당신이 무엇을 보내고 있는지 먼저보아야합니다. 서버에서 전체 요청을 기록 할 수 있도록하여 비교할 수 있습니까? Wireshark에서 보시겠습니까? 또는 서버 대신'nc -kl 8000'과 같은 것을 실행하고,'curl' 명령과 파이썬 프로그램이 그것과 대화하려고 할 때 출력되는 내용을 보십니까? – abarnert

+0

마지막으로, 대부분의 인증 토큰 메커니즘에는 TTL/만기/등이 있습니다. 'curl' 명령은 Python 스크립트가 실패한 직후에도 작동합니까 아니면 과거에 작동 했습니까? – abarnert

답변

1

튜토리얼에서 놓친 내용이 있습니다.

$table->string('client');

그것은 당신이 당신의 요청을 전송하는 클라이언트에서 중요하다 토큰 테이블에서 열이 있습니다. https://github.com/hisorange/browser-detect을 사용하여 요청한 클라이언트를 감지합니다.

하지만 지금은 사용자 에이전트를 보려고합니다. 어디 보자, 지금

Route::filter('auth.token', function($route, $request) 
{ 
.... 

    Log::info($request); 

.... 
} 

: 내 laravel 코드에서 난 그냥 다음 코드를 사용하여 무슨 일이 일어나고 있는지 볼 수있는 모든 요청을 기록

내가 명령 줄에서 곱슬 곱슬 사용

:

curl -u [email protected]:password -X GET http://localhost:8000/account 

내 사용자 에이전트는 사용자 에이전트는,

User-Agent: curl/7.32.0 

내가 위의 코드를 사용하여 파이썬에서 동일한 전송됩니다 :

User-Agent:  Python-urllib/2.7 

Ah! 그게 틀림 없어. Basic Auth를 사용하여 최소한 한 번은 사용자를 인증해야합니다. 그러면 토큰이 제공되고 해당 토큰은 해당 클라이언트에만 유효합니다. 튜토리얼의 처음 부분 http://rjv.im/post/78940780589/api-token-authentication-with-laravel-and-sentry-part에는 그런 조건이 없었습니다. 내가받은 의견에서 여러 클라이언트를 지원하는 방법에 대한 쿼리를 게시 했으므로이 예제는 해당 문제를 해결하기 위해 만들어졌습니다.

그 외에도이 라이브러리는 다음과 같이 제안 할 수도 있습니다 : https://github.com/chrisbjr/api-guard Sentry와 통합하기 쉬운 속도 제한을 지원합니다. 그것은 나의 튜토리얼과는 조금 다릅니다. 내 솔루션을 사용하면 기본 인증 또는 토큰을 사용하여 모든 엔드 포인트를 공격 할 수 있습니다. 위의 라이브러리를 사용하면 토큰 만 허용되므로 토큰을 생성하는 전용 경로가 있습니다. 어떻게 진행되는지 알려주세요.