Error de realización de consulta de CredStore

109

Me encuentro con un problema al realizar llamadas a la API al backend de mis aplicaciones, cada conexión ahora solicita

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

Estoy un poco perdido porque no estoy seguro de qué está causando esto, o qué hace CredStore. ¿Para qué sirve CredStore en iOS?

Anthony Taylor
fuente
Estoy teniendo el mismo registro en el simulador usando iOS 11 + Xcode beta 6. Espero que esto sea solo por la versión beta
nacho4d
¿Nunca encontraste una solución a esto?
swalkner
@swalkner todavía no, todavía estoy tratando de averiguar más.
Anthony Taylor
Tengo el mismo problema. ¿Hay noticias?
Alexander Perechnev
¿Estás reproduciendo un video?
Daniel Storm

Respuestas:

34

Este error ocurre cuando se intenta recuperar un URLCredentialde URLCredentialStoragepara un desconocido URLProtectionSpace. p.ej

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

Darle una credencial para el espacio de protección:

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

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

y el error desaparece la próxima vez que intente recuperar la credencial.

Estoy un poco perdido porque no estoy seguro de qué está causando esto, o qué hace CredStore. ¿Para qué sirve CredStore en iOS?

El almacenamiento de credenciales en iOS permite a los usuarios almacenar de forma segura credenciales basadas en certificados o contraseñas en el dispositivo de forma temporal o permanente en el llavero.

Sospecho que tiene algún tipo de autenticación en su servidor backend y que el servidor solicita un desafío de autenticación a su aplicación (para el cual no existe ninguna credencial).

Probablemente se pueda ignorar con seguridad ya que devolver nil de la URLCredentialStoragees una respuesta válida

Brett
fuente
2
¿Cómo harías para crear un espacio de protección?
Tom Fox
@Brett, ¿puede proporcionar información para protectionSpace?
Pavlos
2
¿Cómo se usa en Moya y Alamofire?
Sony
1
También tengo este problema cuando uso alamofire stackoverflow.com/questions/50342214/… , no sé dónde poner userCredential en Alamofire :(
Alexa289
1
@Brett, también me enfrento a este problema cuando llamo a la API de Twilio a través de AFNetwrking. ¿Alguna sugerencia, qué buscar para resolver el problema con AFNetworking?
Sunita
8

No estoy seguro de por qué recibimos este error cuando realizamos solicitudes con Alamofire, pero si realiza solicitudes de API con algún token en los encabezados HTTP, es posible que no necesite almacenar las credenciales en absoluto. Entonces podemos deshabilitarlo para nuestra solicitud:

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

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

No hay errores después de dicho cambio.

Gleb Tarasov
fuente
4

Este es un error de transporte, agreguemos un permiso de transporte como este en el archivo plist:

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

Tenga cuidado ya que eso permite la conexión a cualquier servidor desde su aplicación. Lea más sobre App Transport Security antes de continuar. Ver comentario de @kezi

tuan nguyen
fuente
No sé por qué esto tiene votos negativos, ¡esta solución me ayudó! He tenido problemas con audiostream a través de FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum
8
@caffeinum Porque esto elimina cualquier seguridad. No se trata de un error del software. Esto se agrega para brindar una barrera de protección a su aplicación. Esta respuesta no dice nada sobre eso o lo que significa cargas arbitrarias.
keji
La revisión de la aplicación de Apple probablemente marcará esto y se le preguntará por qué su aplicación necesita conectarse a hosts arbitrarios. Pueden rechazar la aplicación si no les gusta tu respuesta. Es mucho mejor agregar una clave para el nombre de host específico al que está intentando conectarse.
Jens Alfke
4

Este mismo problema me sucede a mí y descubrí que si la URL de su API no contiene un "/" al final de la URL, iOS no envía el valor de "Autorización" al servidor. Debido a lo cual verá un mensaje como publicado en cuestión en la consola.

Simplemente agregue "/" al final de la URL

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

Edité la cadena que contiene la URL para solucionar este problema:

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

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

Si obtiene este error, cuando use AVPlayer, simplemente llame a .play () en el hilo principal

Andrey Agapov
fuente
Con AVPlayer: no llamo al juego, sino que carga activos y luego llamo a pausa, pero aún recibo esta advertencia.
Jonny
2

La causa por la que recibí este error se debió a que accidentalmente usé dos espacios entre el "Portador" y el token de acceso en mi encabezado de Autorización.

Incorrecto:

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

Correcto:

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

Simple error, pero me tomó un tiempo encontrarlo.

CUENTO
fuente
2

En mi caso, no estaba inicializando Stripe SDK con la clave API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

En caso de cualquier operación de Stripe, podemos imprimir el registro de errores, es fácil de entender.

        print(error.debugDescription)
preetam
fuente
1

OK, tuve este error y luché con él durante mucho tiempo (años) al interactuar con mi aplicación Ruby on Rails.

Tenía las credenciales predeterminadas configuradas como se describe en la respuesta aceptada, pero aún recibí el error y he estado confiando en una respuesta didReceiveChallenge para proporcionar las credenciales, afortunadamente eso funcionó como una solución alternativa.

¡Pero! ¡Acabo de encontrar la solución!

Estaba trabajando con la corazonada de que los campos protectedSpace no coincidían con el desafío de Autorización del servidor de Ruby on Rails, y miré el campo de reino, que parecía ser el único que se dejaba sin definir.

Empecé imprimiendo los encabezados de respuesta del servidor y, aunque pude examinarlos, no incluían el campo WWW-Authorization que habría incluido el campo de reino.

Pensé que esto se debía a que mi aplicación Rails no especificaba el reino, así que comencé a mirar el lado de Rails.

Descubrí que podía especificar el reino en la llamada a

authenticate_or_request_with_http_basic

... que estoy usando para la autenticación básica HTTP.

Ya no estaba especificando un reino, así que agregué uno,

authenticate_or_request_with_http_basic("My Rails App")

Luego agregué la cadena correspondiente al espacio de protección,

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

¡Voila! Eso funcionó, y ya no entiendo el,

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

Incluso después de especificar el reino en la aplicación Rails, todavía no lo veo pasado en el encabezado HTTP, no sé por qué, pero al menos funciona.

Tijeras
fuente
1
Muy contento de encontrar tu respuesta, realmente me estaba asustando.
ggrana
0

El error también puede deberse a una Política de seguridad de contenido (CSP) que puede ser demasiado restrictiva. En nuestro caso, necesitábamos un CSP que sea más o menos completamente abierto y lo permita todo. Tenga en cuenta que abrir el CSP puede ser un gran problema de seguridad (dependiendo de lo que esté haciendo exactamente en la aplicación).

Raphael
fuente
0

Tuve este problema cuando intenté abrir una página http dentro de una vista web. Pero esta página contenía una ventana emergente que se abrió primero.

Cuando el equipo de backend eliminó esta ventana emergente, todo estuvo bien.

Serge Maslyakov
fuente
-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
fuente