CredStore Perform Query error


109

Sto riscontrando un problema mentre eseguo le chiamate API al backend delle mie app, ogni connessione ora richiede

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

Sono un po 'perso perché non sono sicuro di cosa lo stia causando o cosa faccia CredStore. A cosa serve CredStore in iOS?


Sto avendo lo stesso log nel simulatore usando iOS 11 + Xcode beta 6. Spero che questo sia solo a causa della beta
nacho4d

non hai mai trovato una soluzione a questo?
swalkner

@swalkner non ancora, sto ancora cercando di saperne di più.
Anthony Taylor,

Ho lo stesso problema. Qualche notizia?
Alexander Perechnev,

Stai riproducendo un video?
Daniel Storm,

Risposte:


34

Questo errore si verifica quando si tenta di recuperare un URLCredentialda URLCredentialStorageper uno sconosciuto URLProtectionSpace. per esempio

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

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

produce

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

Dagli una credenziale per lo spazio di protezione:

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

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

e l'errore scompare la prossima volta che provi a recuperare la credenziale.

Sono un po 'perso perché non sono sicuro di cosa lo stia causando o cosa faccia CredStore. A cosa serve CredStore in iOS?

L'archiviazione delle credenziali su iOS consente agli utenti di archiviare in modo sicuro le credenziali basate su certificato o password sul dispositivo, temporaneamente o permanentemente nel portachiavi.

Sospetto che tu abbia una sorta di autenticazione sul tuo server back-end e quel server stia richiedendo una sfida di autenticazione alla tua app (per la quale non esistono credenziali).

Probabilmente può essere tranquillamente ignorato poiché restituire zero da URLCredentialStorageè una risposta valida


2
Come faresti a creare uno spazio di protezione?
Tom Fox

@Brett puoi fornire informazioni per protectionSpace?
Pavlos

2
come si usa in Moya e Alamofire?
Sony

1
Ho anche questo problema quando si utilizza alamofire stackoverflow.com/questions/50342214/... , non so dove mettere userCredential in Alamofire :(
Alexa289

1
@Brett, anch'io sto affrontando questo problema quando chiamo Twilio API tramite AFNetwrking. Qualche suggerimento, cosa cercare per afferrare il problema con AFNetworking?
Sunita

8

Non sono sicuro del motivo per cui otteniamo questo errore quando si eseguono richieste con Alamofire, ma se si eseguono richieste API con alcuni token nelle intestazioni HTTP, forse non è necessario l'archivio delle credenziali. Quindi possiamo disabilitarlo per nostra richiesta:

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

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

Nessun errore dopo tale modifica.


4

Questo è un errore di trasporto, aggiungiamo il permesso di trasporto come questo nel file plist:

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

Fai attenzione perché abilita la connessione a qualsiasi server dalla tua app. Ulteriori informazioni sulla sicurezza del trasporto delle app prima di procedere. Vedi commento di @kezi


Non so perché questo ottenga voti negativi, questa soluzione mi ha aiutato! Ho avuto problemi con audiostream tramite FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum

8
@ caffeinum Perché questo rimuove qualsiasi tipo di sicurezza. Questo non è un errore da parte del software. Questo viene aggiunto per fornire una barriera di protezione alla tua app. Questa risposta non dice nulla su questo o sul significato di carichi arbitrari.
keji

La revisione dell'app di Apple probabilmente lo segnalerà e ti verrà chiesto perché la tua app deve connettersi a host arbitrari. Potrebbero rifiutare l'app se non gradiscono la tua risposta. È molto meglio aggiungere una chiave per il nome host specifico a cui stai tentando di connetterti.
Jens Alfke

4

Lo stesso problema accade a me e ho scoperto che se l'URL dell'API non contiene una "/" alla fine dell'URL, iOS non invia il valore "Autorizzazione" al server. A causa del quale vedrai un messaggio come pubblicato in questione nella console.

Quindi aggiungi semplicemente "/" alla fine dell'URL

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

2

Ho modificato la stringa che contiene l'URL per risolvere questo problema:

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

let url = URL(string: myUrl)

2

Se ricevi questo errore, quando usi AVPlayer, chiama .play () sul thread principale


Con AVPlayer: non chiamo play ma caricamento risorse e quindi chiamo pausa, ma ricevo ancora questo avviso.
Jonny

2

La causa per cui ho ricevuto questo errore era dovuta al fatto che ho utilizzato accidentalmente due spazi tra il "Portatore" e il token di accesso nella mia intestazione di autorizzazione.

non corretto:

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

Corretta:

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

Semplice errore, ma ci è voluto un po 'per trovarlo.


2

Nel mio caso, non stavo inizializzando Stripe SDK con la chiave API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

In caso di qualsiasi operazione Stripe, possiamo stampare il registro degli errori, è facile da capire.

        print(error.debugDescription)

1

OK, ho riscontrato questo errore e ho combattuto per molto tempo (anni) durante l'interazione con la mia app Ruby on Rails.

Avevo le credenziali predefinite impostate come descritto nella risposta accettata, ma ho comunque ricevuto l'errore e mi sono affidato a una risposta didReceiveChallenge per fornire le credenziali - fortunatamente ha funzionato come una soluzione.

Ma! Ho appena trovato la soluzione!

Stavo pensando che i campi protectedSpace non corrispondessero alla sfida di autorizzazione del server Ruby on Rails - e ho esaminato il campo realm, che sembrava essere l'unico rimasto indefinito.

Ho iniziato stampando le intestazioni di risposta del server e, sebbene fossi stato in grado di esaminarle, non includevano il campo WWW-Authorization che avrebbe incluso il campo realm.

Ho pensato che fosse forse perché la mia app Rails non specificava il reame, quindi ho iniziato a guardare al lato Rails delle cose.

Ho scoperto di poter specificare il regno nella chiamata a,

authenticate_or_request_with_http_basic

... che sto usando per l'autenticazione HTTP di base.

Non stavo già specificando un reame, quindi ne ho aggiunto uno,

authenticate_or_request_with_http_basic("My Rails App")

Ho quindi aggiunto la stringa corrispondente a protectionSpace,

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

Ecco! Ha funzionato e non ho più il,

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

Anche dopo aver specificato il realm nell'app Rails, non lo vedo ancora passato nell'header HTTP, non so perché, ma almeno funziona.


1
Sono molto felice di aver trovato la tua risposta, mi ha davvero spaventato.
ggrana

0

L'errore potrebbe anche essere causato da un Content Security Policy (CSP) che potrebbe essere troppo restrittivo. Nel nostro caso, avevamo bisogno di un CSP che fosse più o meno completamente aperto e permettesse tutto. Tieni presente che l'apertura del CSP può essere un grande problema di sicurezza (a seconda di cosa stai facendo esattamente nell'app).


0

Ho riscontrato questo problema quando ho provato ad aprire una pagina http all'interno di una visualizzazione web. Ma questa pagina conteneva un popup che è stato aperto per primo.

Quando il team di backend ha rimosso questo popup, tutto è diventato OK.


-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)
     }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.