2014-10-24 2 views
2

AFNetworking을 처음 사용하고 Go로 작성한 API와의 대화에 사용하려고합니다. Authorization 헤더를 가져 오는 데 문제가 있습니다.AF 네트워킹 및 인증 헤더

+ (HMAPIClient *)sharedHMAPIClient 
{ 
    static HMAPIClient* _sharedHMAPIClient = nil; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _sharedHMAPIClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:HMBaseURL]]; 
    }); 

    return _sharedHMAPIClient; 
} 

- (instancetype)initWithBaseURL:(NSURL *)url 
{ 
    self = [super initWithBaseURL:url]; 

    if (self) { 
     self.responseSerializer = [AFJSONResponseSerializer serializer]; 
     self.requestSerializer = [AFJSONRequestSerializer serializer]; 

     [self.requestSerializer setAuthorizationHeaderFieldWithUsername:RegistrationAPIKey 
                   password:@"Doesn't matter what goes here."]; 
    } 

    return self; 
} 

- (void)hitTestEndpoint 
{ 
    [self GET:@"testEndpoint" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"%@", responseObject); 
    } failure:^(NSURLSessionDataTask *task, NSError *error) { 
     NSLog(@"%@", error); 
    }]; 
} 

을 다음과 같이 나는 그것을 AFHTTPSessionManager을 서브 클래스 및 구성한 내가 호출 할 때 - (무효) hitTestEndpoint, 내 서버 로그에 다음과 같은 헤더 (권한이없는)을 참조하십시오

Key: Accept-Encoding Value: [gzip, deflate] 
Key: Connection Value: [keep-alive] 
Key: Accept-Language Value: [en;q=1] 
Key: User-Agent Value: [TestApp/2 (iPad Simulator; iOS 8.1; Scale/2.00)] 
Key: Accept Value: [*/*] 

비교를 위해를 나는 다음 curl 명령과 같은 엔드 포인트, 나는 다음과 같은 헤더를 참조

curl https://api.example.com/v1/testEndpoint/ -u test_xqzwjcasogptbnpa: 

쳤을 때 :

Key: Authorization Value: [Basic eHF6d2pjYXNvZ3B0Ym5wYTo=] 
Key: User-Agent Value: [curl/7.30.0] 
Key: Accept Value: [*/*] 

나를 올바른 방향으로 안내 할 수 있습니까? - 고마워요

업데이트 : 각 요청을 볼 수 있도록 AFNetworkActivityLogger를 추가했습니다. 실제로 Authorization 헤더가 포함됩니다. 또한 클라이언트에서 수신 한 HTTP 요청 헤더를 반환하는 http://headers.jsontest.com을 시도했습니다. 인증 헤더 은 해당 출력에입니다.

그래서 내 서버에 문제가 있어야합니다. 각 요청에 대해 이미 모든 헤더를 로깅하고 있으며 어디에서 볼 것인지 잘 모르겠습니다. 이 질문에 태그를 달아 누군가가 아이디어를 가지고 있는지 확인하십시오.

업데이트 2 : 는 내 요청 처리기의 상단에 httputil.DumpRequest에 대한 호출을 추가하고, 또한 인증 헤더가 없음을 보여줍니다. 그건 그렇고, 내가 지정한 모든 맞춤 헤더가 예상대로 나타납니다. 누락 된 인증 헤더입니다.

다음은 이동 코드입니다 :

func testResponse(rw http.ResponseWriter, request *http.Request) { 

    // check output from DumpRequest() 
    dump,err := httputil.DumpRequest(request,true) 
    check(err) 
    fmt.Println("Output of DumpRequest():") 
    fmt.Println(string(dump)) 
    fmt.Println("============") 

    fmt.Println("request.Headers:") 
    for key, value := range request.Header { 
     fmt.Println("Key:", key, "Value:", value) 
    } 
    fmt.Println("===============") 

    // return some dummy JSON 
    rw.Header().Set("Content-Type", "application/json") 
    rw.Write(PersonToJson(getPerson("2f6251b8-d7c4-400f-a91f-51e09b8bfaf4"))) 

}

답변

1

서버는 이동이 이미 구문 분석 된 후에는 헤더와 같은 모습을 보여주는하고 로그인합니다. Go가 수신 된 원시, 일반 텍스트 HTTP 헤더를 보는 것이 도움이됩니다. Go가 헤더를 무시하고 있거나 업스트림에서 스트리핑 중이라면이를 알려줍니다.

편집 : 원시 요청을하기 전에 Go가 Authorization 헤더를 제거하는 이유를 모르겠습니다. 그러나 나는 Authorization 헤더가 정상적인 승인되지 않은 요청을하고 WWW-Authenticate 헤더가있는 서버로부터 401 응답을받은 후에 만 ​​클라이언트에서 정상적으로 전송된다고 생각합니다. 클라이언트가 Authorization 헤더를 파란색으로 보내고있는 것처럼 들리므로 Go 서버 API는 클라이언트에 메시지를 보내지 않았으므로 헤더를 벗겨 내고 &을 무시하고 있습니다.

모든 요청에 ​​간단한 인증 토큰을 보내려는 경우 설정 한 다른 헤더가 올바르게 도착했다고 표시 했으므로 대신 X- 헤더를 사용했다면 어떻게 될까요?

+0

좋은 아이디어. DumpRequest를 사용하여 http 요청 전체를 살펴 보았지만 거기에는 존재하지 않습니다. 이 정보로 위의 질문을 업데이트했습니다. – boxel

+0

실제로 나를 위해 일하는 예. 나는 웹 개발자에게 익숙하지 않고 "올바른"방식으로 작업하려고했지만 사용자 정의 헤더를 사용하는 것이 좋습니다. – boxel