CredStoreクエリ実行エラー


109

アプリのバックエンドへのAPI呼び出しを実行中に問題が発生し、すべての接続で次のプロンプトが表示されます

CredStore - performQuery - Error copying matching creds.  Error=-25300, query={
    atyp = http;
    class = inet;
    "m_Limit" = "m_LimitAll";
    ptcl = http;
    "r_Attributes" = 1;
    srvr = "myappsurl.com";
    sync = syna;
}

何が原因なのか、CredStoreが何をしているのかわからないので、少し迷っています。CredStoreはiOSでどのような目的を果たしますか?


iOS 11 + Xcodeベータ6を使用して、シミュレータで同じログを
取得しています

これに対する解決策を見つけたことはありませんか?
swalkner 2017

@swalknerはまだですが、まだ詳細を調べています。
アンソニーテイラー

私は同じ問題を抱えています。連絡あった?
Alexander Perechnev 2017

ビデオを再生していますか?
ダニエルストーム

回答:


34

このエラーは、不明なURLCredentialからを取得しようとしたときに発生します。例えばURLCredentialStorageURLProtectionSpace

let protectionSpace = URLProtectionSpace.init(host: host, 
                                              port: port, 
                                              protocol: "http", 
                                              realm: nil, 
                                              authenticationMethod: nil)

var credential: URLCredential? = URLCredentialStorage.shared.defaultCredential(for: protectionSpace)

作り出す

CredStore - performQuery - Error copying matching creds.  Error=-25300, query={
    class = inet;
    "m_Limit" = "m_LimitAll";
    ptcl = http;
    "r_Attributes" = 1;
    srvr = host;
    sync = syna;
}

保護スペースの資格を与えます。

let userCredential = URLCredential(user: user, 
                                   password: password, 
                                   persistence: .permanent)

URLCredentialStorage.shared.setDefaultCredential(userCredential, for: protectionSpace)

資格情報を取得しようとすると、エラーはなくなります。

何が原因なのか、CredStoreが何をしているのかわからないので、少し迷っています。CredStoreはiOSでどのような目的を果たしますか?

iOSの認証情報ストレージにより、ユーザーは証明書ベースまたはパスワードベースの認証情報をデバイスに一時的または永続的にキーチェーンに安全に保存できます。

バックエンドサーバーで何らかの認証があり、そのサーバーがアプリに認証チャレンジを要求していると思われます(資格情報は存在しません)。

からnilを返すことURLCredentialStorageは有効な応答であるため、おそらく安全に無視できます


2
どのようにして保護スペースを作りましたか?
トムフォックス

@Brett保護スペースの情報を提供していただけますか?
パブロス2018年

2
MoyaとAlamofireでの使用方法
ソニー、

1
alamofire使用しているとき、私はまた、この問題を持っているstackoverflow.com/questions/50342214/...を、私は:( AlamofireでuserCredentialをどこに置くか分からない
Alexa289

1
@ブレット、AFNetwrkingからTwilio APIを呼び出すときにもこの問題に直面しています。AFNetworkingの問題をつかむために何を検索すればいいですか?
Sunita、

8

Alamofireでリクエストを実行するときにこのエラーが発生する理由はわかりませんが、HTTPヘッダーにトークンを含むAPIリクエストを実行する場合、認証情報ストアはまったく必要ない可能性があります。そのため、リクエストに対して無効にすることができます。

let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = ourHeaders
// disable default credential store
configuration.urlCredentialStorage = nil

let manager = Alamofire.SessionManager(configuration: configuration)
...

そのような変更後のエラーはありません。


4

これはトランスポートエラーです。次のようなトランスポート権限をplistファイルに追加してみましょう。

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

アプリからサーバーへの接続が可能になるので注意してください。続行する前に、App Transport Securityの詳細を読んでください。@keziのコメントを見る


なぜこれが反対票を投じるのか分かりませんが、この解決策は私を助けました!FRadioPlayer github.com/fethica/FRadioPlayerを介したオーディオストリームで
caffeinum

8
@caffeinumこれにより、これまでセキュリティが削除されます。これはソフトウェア側のエラーではありません。これは、アプリを保護するバリアを提供するために追加されます。この答えは、それについて、または任意のロードが何を意味するかについては何も述べていません。
keji 2018年

Appleのアプリレビューはおそらくこれにフラグを立て、アプリが任意のホストに接続する必要がある理由を尋ねられます。あなたの答えが気に入らない場合、彼らはアプリを拒否するかもしれません。接続しようとしている特定のホスト名のキーを追加することをお勧めします。
Jens Alfke

4

この同じ問題が私にも起こり、API URLのURLの末尾に「/」が含まれていない場合、iOSが「Authorization」値をサーバーに送信しないことがわかりました。そのため、コンソールに問題の投稿のようなメッセージが表示されます。

URLの最後に「/」を追加するだけです

https://example.com/api/devices/

2

この問題を修正するために、URLを含む文字列を編集しました。

var myUrl = "http://myurl.com"
myUrl = myUrl.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!

let url = URL(string: myUrl)

2

このエラーが発生した場合、AVPlayerを使用するときは、メインスレッドで.play()を呼び出すだけです。


AVPlayerを使用-playを呼び出すのではなく、アセットを読み込んでからpauseを呼び出していますが、それでもこの警告が表示されます。
ジョニー

2

このエラーが発生した原因は、Authorizationヘッダーの "Bearer"とアクセストークンの間に誤って2つのスペースを使用したことが原因でした。

不正解:

request.setValue("Bearer  \(accessToken)", forHTTPHeaderField: "Authorization")

正しい:

request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")

単純な間違いですが、見つけるのにしばらく時間がかかりました。


2

私の場合、APIキーでStripe SDKを初期化していませんでした。

        STPPaymentConfiguration.shared().publishableKey = publishableKey

Stripe操作の場合は、エラーログを印刷できます。これは理解しやすいものです。

        print(error.debugDescription)

1

わかりました。このエラーが発生し、Ruby on Railsアプリを操作するときに長い間(何年も)エラーが発生しました。

受け入れられた回答に記載されているようにデフォルトの資格情報を設定しましたが、それでもエラーが発生し、didReceiveChallenge応答を使用して資格情報を提供しています-幸い、これは回避策として機能しました。

だが!私は解決策を見つけました!

私は、protectedSpaceフィールドがRuby on RailsサーバーからのAuthorizationチャレンジと一致しないという問題に取り組んでいました-未定義のままにされた唯一のフィールドであると思われるレルムフィールドを調べました。

私はサーバーの応答ヘッダーを印刷することから始めましたが、これらを調べることはできましたが、レルムフィールドを含むはずのWWW-Authorizationフィールドが含まれていませんでした。

これはおそらく私のRailsアプリがレルムを指定していないためだと思ったので、物事のRails側を調べ始めました。

呼び出しでレルムを指定できることがわかりました。

authenticate_or_request_with_http_basic

... HTTP基本認証に使用しています。

レルムはまだ指定していなかったので、追加しました。

authenticate_or_request_with_http_basic("My Rails App")

次に、対応する文字列をprotectionSpaceに追加しました。

NSURLProtectionSpace *protectionSpace =
    [[NSURLProtectionSpace alloc] initWithHost:@"myrailsapp.com"
        port:443
        protocol:NSURLProtectionSpaceHTTPS
        realm:@"My Rails App"
        authenticationMethod:NSURLAuthenticationMethodHTTPBasic];

出来上がり!それはうまくいきました、そして私はもう得ません、

CredStore - performQuery - Error copying matching creds.  Error=-25300

Railsアプリでレルムを指定した後でも、それがHTTPヘッダーで渡されたことがわかりません。理由はわかりませんが、少なくとも機能します。


1
あなたの答えを見つけてとてもうれしかった、それは本当に私をビックリさせました。
ggrana

0

このエラーは、コンテンツセキュリティポリシー(CSP)が原因である場合もあります。私たちの場合、多かれ少なかれ完全にオープンで、すべてを可能にするCSPが必要でした。CSPを開くと、セキュリティ上の大きな問題になる可能性があることに注意してください(アプリで何をしているのかによって異なります)。


0

この問題は、Webビュー内でhttpページを開こうとしたときに発生しました。しかし、このページには最初に開かれたポップアップが含まれていました。

バックエンドチームがこのポップアップを削除すると、すべてが正常になりました。


-1
    let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)!
    let base64Credentials = credentialData.base64EncodedString(options: [])
    let headers = ["Authorization": "Basic \(base64Credentials)"]
    Alamofire.request(url, method: .get, parameters: params,encoding: URLEncoding.default,headers: headers)
                .responseJSON{
            response in
            guard let value =  response.result.value else {return}
                    print(value)
     }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.