CredStore Abfragefehler ausführen

108

Beim Ausführen von API-Aufrufen für das App-Backend tritt ein Problem auf. Jede Verbindung fordert jetzt dazu auf

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;
}

Ich bin ein wenig verloren, da ich nicht sicher bin, was dies verursacht oder was CredStore überhaupt tut. Welchen Zweck erfüllt CredStore in iOS?

Anthony Taylor
quelle
Ich habe das gleiche Protokoll im Simulator mit iOS 11 + Xcode Beta 6. Ich hoffe, das liegt nur an der Beta
nacho4d
Hast du nie eine Lösung dafür gefunden?
Swalkner
@swalkner noch nicht, immer noch versuchen, mehr herauszufinden.
Anthony Taylor
Ich habe das gleiche Problem. Irgendwelche Neuigkeiten?
Alexander Perechnev
Spielst du ein Video?
Daniel Storm

Antworten:

34

Dieser Fehler tritt auf, wenn versucht wird, einen URLCredentialvon URLCredentialStoragefür einen Unbekannten abzurufen URLProtectionSpace. z.B

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

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

produziert

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

Geben Sie ihm einen Berechtigungsnachweis für den Schutzbereich:

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

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

und der Fehler verschwindet, wenn Sie das nächste Mal versuchen, den Berechtigungsnachweis abzurufen.

Ich bin ein wenig verloren, da ich nicht sicher bin, was dies verursacht oder was CredStore überhaupt tut. Welchen Zweck erfüllt CredStore in iOS?

Durch die Speicherung von Anmeldeinformationen unter iOS können Benutzer zertifikatbasierte oder kennwortbasierte Anmeldeinformationen auf dem Gerät entweder vorübergehend oder dauerhaft im Schlüsselbund speichern.

Ich vermute, dass Sie eine Art Authentifizierung auf Ihrem Backend-Server haben und dieser Server eine Authentifizierungsaufforderung an Ihre App anfordert (für die keine Anmeldeinformationen vorhanden sind).

Es kann wahrscheinlich ignoriert werden, da die Rückgabe von nil von URLCredentialStorageeine gültige Antwort ist

Brett
quelle
2
Wie würden Sie vorgehen, um einen Schutzraum zu schaffen?
Tom Fox
@Brett können Sie bitte Informationen für ProtectionSpace bereitstellen?
Pavlos
2
wie in Moya und Alamofire zu verwenden?
Sony
1
Ich habe auch dieses Problem bei der Verwendung von alamofire stackoverflow.com/questions/50342214/… . Ich weiß nicht, wo userCredential in Alamofire abgelegt werden soll :(
Alexa289
1
@Brett, ich bin auch mit diesem Problem konfrontiert, wenn ich die Twilio-API über AFNetwrking aufrufe. Irgendwelche Vorschläge, was zu suchen ist, um das Problem mit AFNetworking zu lösen?
Sunita
8

Ich bin nicht sicher, warum dieser Fehler auftritt, wenn Anforderungen mit Alamofire ausgeführt werden. Wenn Sie jedoch API-Anforderungen mit einem Token in HTTP-Headern ausführen, benötigen Sie möglicherweise überhaupt keinen Speicher für Anmeldeinformationen. So können wir es für unsere Anfrage deaktivieren:

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

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

Keine Fehler nach einer solchen Änderung.

Gleb Tarasov
quelle
4

Dies ist ein Transportfehler. Fügen wir die Transportberechtigung wie folgt in die plist-Datei ein:

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

Seien Sie vorsichtig, da dies die Verbindung zu einem beliebigen Server von Ihrer App aus ermöglicht. Lesen Sie mehr über App Transport Security, bevor Sie fortfahren. Siehe Kommentar von @kezi

Tuan Nguyen
quelle
Ich weiß nicht, warum dies zu Abstimmungen führt, diese Lösung hat mir geholfen! Ich hatte Probleme mit Audiostream über FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum
8
@caffeinum Weil dadurch jegliche Sicherheit beseitigt wird. Dies ist kein Fehler der Software. Dies wird hinzugefügt, um Ihrer App eine Schutzbarriere zu verleihen. Diese Antwort sagt nichts darüber aus oder was willkürliche Belastungen bedeuten.
Keji
Apples App-Überprüfung wird dies wahrscheinlich kennzeichnen und Sie werden gefragt, warum Ihre App eine Verbindung zu beliebigen Hosts herstellen muss. Sie können die App ablehnen, wenn ihnen Ihre Antwort nicht gefällt. Es ist viel besser, einen Schlüssel für den spezifischen Hostnamen hinzuzufügen, zu dem Sie eine Verbindung herstellen möchten.
Jens Alfke
4

Das gleiche Problem tritt bei mir auf und ich habe festgestellt, dass iOS keinen "Authorization" -Wert an den Server sendet, wenn Ihre API-URL am Ende der URL kein "/" enthält. Aufgrund dessen wird in der Konsole eine Nachricht angezeigt, wie sie in Frage gestellt wurde.

Fügen Sie einfach "/" am Ende der URL hinzu

https://example.com/api/devices/
Iqbal Khan
quelle
2

Ich habe die Zeichenfolge mit der URL bearbeitet, um dieses Problem zu beheben:

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

let url = URL(string: myUrl)
Pavlos
quelle
2

Wenn Sie diesen Fehler erhalten, rufen Sie bei Verwendung von AVPlayer einfach .play () im Hauptthread auf

Andrey Agapov
quelle
Mit AVPlayer - Ich rufe nicht play an, sondern lade Assets und rufe dann pause auf, habe aber trotzdem diese Warnung erhalten.
Jonny
2

Die Ursache für diesen Fehler war, dass ich versehentlich zwei Leerzeichen zwischen dem "Träger" und dem Zugriffstoken in meinem Autorisierungsheader verwendet habe.

Falsch:

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

Richtig:

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

Einfacher Fehler, aber es hat eine Weile gedauert, ihn zu finden.

GESCHICHTE
quelle
2

In meinem Fall habe ich das Stripe SDK nicht mit dem API-Schlüssel initialisiert.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

Im Falle einer Stripe-Operation können wir das leicht verständliche Fehlerprotokoll drucken.

        print(error.debugDescription)
Preetam
quelle
1

OK, ich hatte diesen Fehler und habe lange (Jahre) damit gekämpft, als ich mit meiner Ruby on Rails-App interagierte.

Ich hatte Standardanmeldeinformationen eingerichtet, wie in der akzeptierten Antwort beschrieben, habe aber immer noch den Fehler erhalten und mich auf eine didReceiveChallenge-Antwort verlassen, um die Anmeldeinformationen bereitzustellen - zum Glück hat das als Problemumgehung funktioniert.

Aber! Ich habe gerade die Lösung gefunden!

Ich habe an der Vermutung gearbeitet, dass die protectedSpace-Felder nicht mit der Autorisierungsaufforderung vom Ruby on Rails-Server übereinstimmen - und ich habe in das Realm-Feld geschaut, das anscheinend das einzige war, das nicht definiert wurde.

Ich habe zunächst die Server-Antwortheader ausgedruckt, und obwohl ich diese untersuchen konnte, enthielten sie nicht das WWW-Autorisierungsfeld, das das Realm-Feld enthalten hätte.

Ich dachte, das lag vielleicht daran, dass meine Rails-App den Bereich nicht spezifizierte, also fing ich an, die Rails-Seite der Dinge zu betrachten.

Ich fand heraus, dass ich den Bereich im Aufruf an angeben konnte,

authenticate_or_request_with_http_basic

... die ich für die HTTP Basic-Authentifizierung verwende.

Ich habe noch keinen Bereich angegeben, also einen hinzugefügt,

authenticate_or_request_with_http_basic("My Rails App")

Ich habe dann die entsprechende Zeichenfolge zum Schutzbereich hinzugefügt.

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

Voila! Das hat funktioniert und ich verstehe das nicht mehr,

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

Selbst nachdem ich den Bereich in der Rails-App angegeben habe, sehe ich ihn immer noch nicht im HTTP-Header übergeben. Ich weiß nicht warum, aber zumindest funktioniert er.

Snips
quelle
1
Ich bin sehr froh, deine Antwort gefunden zu haben, es hat mich wirklich ausgeflippt.
Ggrana
0

Der Fehler kann auch durch eine zu restriktive Content Security Policy (CSP) verursacht werden. In unserem Fall brauchten wir einen CSP, der mehr oder weniger vollständig offen ist und alles zulässt. Beachten Sie, dass das Öffnen des CSP ein großes Sicherheitsproblem darstellen kann (je nachdem, was genau Sie in der App tun).

Raphael
quelle
0

Ich habe dieses Problem erhalten, als ich versucht habe, eine http-Seite in einer Webansicht zu öffnen. Diese Seite enthielt jedoch ein Popup, das zuerst geöffnet wurde.

Als das Backend-Team dieses Popup entfernte, wurde alles in Ordnung.

Serge Maslyakov
quelle
-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)
     }
r.chernetsov
quelle