2012-04-30 4 views
1

이상한 문제가 있습니다. 그래서 나는 사용자가 로그인 할 수있는 아이폰 앱을 개발하고 있으며, 로그인하면 앱은 서버에 http GET 요청을하여 사용자를 인증합니다. 사용자 이름과 암호가 맞으면 인증 토큰 (일반적인 물건)을 반환합니다.내 아이폰 앱을 내 서버에 연결할 수없는 이유는 무엇입니까?

이상한 부분은 로컬로 테스트 할 때 HTTP 요청 URL을 로컬 컴퓨터로 가리키면 작동합니다. 모든 것이 올바르게 인증되고 모든 데이터가 올바르게 반환됩니다.

하지만 오늘은 내 서버에 나머지 API를 배포하기로 결정한 앱을 안정적으로 사용했지만 http 요청 URL을 내 서버 URL로 변경하면 요청이 실패합니다.

어쩌면 서버가 올바르게 배치되지 않아서 firefox 나머지 클라이언트로 http 엔드 포인트를 테스트했는데 모든 것이 제대로 작동하고 권한이 작동하고 데이터가 반환 된 것 같습니다.

아무 생각 없나요? 나는 그 문제가 무엇인지에 관해서 길을 잃었다.

AFNetworking 라이브러리를 사용하여 요청합니다.

여기 내 코드입니다 :

self.apiHttpClient = [[TKRHttpClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://mywebsite.com/api"]]; 

-------------- 

NSString *username = [usernameField text]; 
NSString *password = [passwordField text]; 
TKRHttpClient *httpClient = [TKRHttpClient sharedInstance]; 
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"/user/auth" parameters:nil]; 
[request addValue:username forHTTPHeaderField:@"username"]; 
[request addValue:password forHTTPHeaderField:@"password"]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    if(response.statusCode == 200){ 
     NSDictionary * headers = [response allHeaderFields]; 
     NSString *token = [headers objectForKey:@"auth_token"]; 
     NSLog(@"token was %@", token); 
     [[AppController sharedAppController] initializeDataForUserToken:token]; 
    }else{ 
     NSLog(@"upload failed!"); 
    } 
} failure:^(NSURLRequest *request , NSHTTPURLResponse *response , NSError *error , id JSON) { 
    NSLog(@"code was: %i", response.statusCode); 
    if(response.statusCode == 401){ 
     [errorMessage setText:@"Incorrect password or username"]; 
    } 
}]; 
[operation start]; 

내가 브레이크 포인트에 넣어하고, 요구는 바로 실패 블록에가는 것 같다. "NSLog (@"코드는 : % i ", response.statusCode);" 오류 블록에서 200을 인쇄합니다. 그러나 서버의 로그가 끝날 때 요청이 수신되지 않았습니다.

모든 도움을 주시면 대단히 감사하겠습니다. 왜 내 로컬 바람둥이에 대해 작동하지만, 내 서버에 배포 할 때 작동하지 않습니다 내 인생의 원인을 알아낼 수 없습니다.

미리 감사드립니다.

+2

연결을 패킷 스니핑하거나 Fiddler와 같은 프록시를 통해 휴대 전화를 실행하고 진행 상황을 확인하십시오. – Brad

+1

코드를 올바르게 읽는 경우 사용자 이름과 암호를 (https) 암호화없이 GET 매개 변수로 보내 게됩니다. 이것은 연결을 스니핑하는 사람이 사용자의 자격 증명을 도용 할 수 있음을 의미합니다. – TheRealKingK

+0

화려한 Brad! 내가 왜 그렇게 생각하지 않았어 ..나는 네가 말했듯이 찰스를 대신 사용했다. 나는 그 문제를 발견했다. 나는 대답을 게시 할 것이다. 다시 감사합니다 brad. @TheRealKingK 좋은 눈. 나는 지금 프로토 타입 단계에있다. 나는 곧 SSL 인증서를 얻으려고하고있다. – Khon

답변

0

@ Brad의 제안 덕분에 내 문제의 원인을 발견했습니다.

요청을 찰스에서 검사 할 때 요청이 "http://mywebsite.com"으로 발견 된 다음 경로로/user/auth입니다. 그래서 "/ api"부분이 사라졌습니다.

어쩌면 이것은 표준이지만 잘 모르겠지만 AFHTTPClient (내 TKRHttpClient가 AFHTTPClient를 확장) initWithBaseURL은 실제로 호스트 URL을 의미합니다. "/ api"부분이 잘립니다. 내가 루트로 로컬 응용 프로그램을 구축, 그래서 "/ API를"

이렇게 두 가지 방법으로이 문제를 해결하는이 없었기 때문에

는하고 로컬로 작업 된 이유입니다. 1. 루트로 서버에 앱으로 재배포하십시오. 또는 2. 변화의 코드의 라인 :

NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"/user/auth" parameters:nil]; 

TO :

NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"api/user/auth" parameters:nil]; 

희망이 미래에 AFNetworking을 사용하는 모든 사용자를하는 데 도움이됩니다.

+0

이것은'AFHTTPClient'에 설명되어 있습니다. 'baseURL'에 경로가 포함되어 있으면 클라이언트에 전달 된 절대 경로 매개 변수가 초기 경로를 덮어 씁니다. 그래서 당신의 경우'@ "/ user/auth"'를'@ "user/auth"'로 바꾸는 것은 그 트릭을 수행 할 것입니다. – mattt

관련 문제