1

ここ数時間、壁に頭をぶつけていて、どこにも解決策のちらつきさえ見つかりません。JSON の操作方法を学習するアプリに取り組んでいるので、最初は GitHub 上のすべてのリポジトリのリストを返すだけの単純なアプリを作成しています。NSURLConnection によって返されたデータから JSON 応答を問題なく抽出できます。残念ながら、認証が必要なものにアクセスしようとすると、応答は常に{ message = "Not Found"; } 次のようになりますすべての正しい情報で応答するので、api.github.com と正常に通信できていることがわかります。まず、私が使用するリクエストを開始します。

    -(IBAction)retriveRepos:(id)sender
{
    responseData = [[NSMutableData data] retain];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.github.com/user/repos"]];
    [request setHTTPMethod:@"GET"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge認証方法が呼び出されると、次のように返されますNSURLAuthenticationMethodServerTrust(ログインするためにユーザー名とパスワードを提供する必要があるように感じるので、これは奇妙だと思います)。Apple のドキュメントによると、NSURLCredentialwithを作成する必要がありますinitWithTrust:。私は答えをグーグルで検索し、渡された のserverTrustからを取得するように言っている場所をいくつか見つけました。これを行っても、まったく効果がある兆候は見られません。protectionSpaceNSURLAuthenticationChallengeNSURLCredential

if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
        NSLog(@"challenge.protectionSpace.serverTrust: %@", challenge.protectionSpace.serverTrust); // This logs "challenge.protectionSpace.serverTrust: <SecTrust 0x10340b2e0 [0x7fff7cc12ea0]>"
        NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:challenge.protectionSpace.serverTrust];
        NSLog(@"credential: %@", credential); // Always logs something like "credential: <NSURLCredential: 0x1002d2f20>: (null)"
        NSURLCredential *otherCredential = [[NSURLCredential alloc] initWithUser:@"user" password:@"password" persistence:NSURLCredentialPersistencePermanent];
        NSLog(@"otherCredential: %@", otherCredential); // This logs otherCredential: <NSURLCredential: 0x1018d0840>: user"
        [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
    }

私はより広範なロギングも使用しましたが、それcredentialは実際には存在していましたが (最初はまったく作成されていないと思っていました)、属性が設定されていませんでしたcertificates: (null) hasPassword: 0 identity: (null) password: (null) 。問題は私の認証にあるとしか思えませんが、見つけた例を文字どおりに追跡しました。私は Lion の GM プレビューを使用しているので、バグを見つけたか、GitHub API に何らかのバグがある可能性があると思いますが、私のスキルレベルを考えると、私が探している馬鹿である可能性が高いと思います。私の目の前に座っている答えの上に。認証のすべてのステップ (できればすべてのスタイル) を実際に順を追って説明する優れたガイドを誰かが知っている場合は、メソッドを使用するように指示するだけで、どこにSecTrustRefに由来します。

4

1 に答える 1

0

NSURLAuthenticationMethodServerTrustSSL 接続をネゴシエートするときに返されるものです。これにより、サーバーの信頼を評価する機会が得られます (またはその逆)。Technote 2232では、これについて少し詳しく説明しています。デリゲートはそれを処理する必要があります。技術情報はサンプル コード Advanced URL Connections のソースにリンクしており、その課題に対応する方法を示しています。

絶望しないでください。サーバーからの HTTP 認証ステップがある場合、デリゲートが後でそれを取得することがわかります。

于 2013-07-25T08:14:30.413 に答える