Erreur de requête CredStore Perform

109

Je rencontre un problème en effectuant des appels d'API vers le backend de mes applications, chaque connexion s'affiche maintenant avec

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

Je suis un peu perdu car je ne suis pas sûr de ce qui cause cela, ni de ce que fait même CredStore. À quoi sert CredStore dans iOS?

Anthony Taylor
la source
J'ai le même journal dans le simulateur en utilisant iOS 11 + Xcode beta 6. J'espère que c'est juste à cause de la version bêta
nacho4d
n'avez-vous jamais trouvé de solution à cela?
swalkner
@swalkner pas encore, essayant toujours d'en savoir plus.
Anthony Taylor
J'ai le même problème. Des nouvelles?
Alexander Perechnev
Jouez-vous une vidéo?
Daniel Storm du

Réponses:

34

Cette erreur se produit lorsque vous essayez de récupérer un URLCredentialdepuis URLCredentialStoragepour un inconnu URLProtectionSpace. par exemple

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

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

produit

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

Donnez-lui un identifiant pour l'espace de protection:

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

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

et l'erreur disparaît la prochaine fois que vous essayez de récupérer les informations d'identification.

Je suis un peu perdu car je ne suis pas sûr de ce qui cause cela, ni de ce que fait même CredStore. À quoi sert CredStore dans iOS?

Le stockage des informations d'identification sur iOS permet aux utilisateurs de stocker en toute sécurité des informations d'identification basées sur des certificats ou des mots de passe sur l'appareil, temporairement ou définitivement sur le trousseau.

Je soupçonne que vous avez une sorte d'authentification sur votre serveur principal et que ce serveur demande un défi d'authentification à votre application (pour laquelle aucune information d'identification n'existe).

Il peut probablement être ignoré en toute sécurité car renvoyer nil de URLCredentialStorageest une réponse valide

Brett
la source
2
Comment feriez-vous pour créer un espace de protection?
Tom Fox
@Brett pouvez-vous s'il vous plaît fournir des informations pour protectionSpace?
Pavlos
2
comment utiliser dans Moya et Alamofire?
sony
1
J'ai aussi ce problème lors de l'utilisation d'alamofire stackoverflow.com/questions/50342214/… , je ne sais pas où mettre userCredential dans Alamofire :(
Alexa289
1
@Brett, je suis également confronté à ce problème lorsque j'appelle l'API Twilio via AFNetwrking. Des suggestions, que rechercher pour saisir le problème avec AFNetworking?
Sunita
8

Je ne sais pas pourquoi nous obtenons cette erreur lors de l'exécution de requêtes avec Alamofire, mais si vous effectuez des requêtes API avec un jeton dans les en-têtes HTTP, vous n'avez peut-être pas du tout besoin de stocker les informations d'identification. Nous pouvons donc le désactiver pour notre demande:

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

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

Aucune erreur après un tel changement.

Gleb Tarasov
la source
4

C'est une erreur de transport, ajoutons une autorisation de transport comme celle-ci dans le fichier plist:

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

Soyez prudent car cela permet la connexion à n'importe quel serveur depuis votre application. En savoir plus sur App Transport Security avant de continuer. Voir le commentaire de @kezi

tuan nguyen
la source
Je ne sais pas pourquoi cela suscite des votes négatifs, cette solution m'a aidé! J'ai eu des problèmes avec le flux audio via FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum
8
@caffeinum Parce que cela supprime toute sécurité. Ce n'est pas une erreur de la part du logiciel. Ceci est ajouté pour donner une barrière de protection à votre application. Cette réponse ne dit rien à ce sujet ni sur la signification des charges arbitraires.
keji
L'examen de l'application d'Apple signalera probablement cela et on vous demandera pourquoi votre application doit se connecter à des hôtes arbitraires. Ils peuvent rejeter l'application s'ils n'aiment pas votre réponse. Il est préférable d'ajouter une clé pour le nom d'hôte spécifique auquel vous essayez de vous connecter.
Jens Alfke
4

Ce même problème m'arrive et j'ai constaté que si l'URL de votre API ne contient pas de "/" à la fin de l'URL, iOS n'envoie pas de valeur "Autorisation" au serveur. En raison de quoi vous verrez un message comme posté en question dans la console.

Ajoutez simplement "/" à la fin de l'URL

https://example.com/api/devices/
Iqbal Khan
la source
2

J'ai modifié la chaîne qui contient l'URL pour résoudre ce problème:

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

let url = URL(string: myUrl)
Pavlos
la source
2

Si vous obtenez cette erreur, lorsque vous utilisez AVPlayer, appelez simplement .play () sur le thread principal

Andrey Agapov
la source
Avec AVPlayer - Je n'appelle pas play, mais je charge des ressources, puis j'appelle pause, mais j'ai toujours cet avertissement.
Jonny
2

La cause de cette erreur était due à l'utilisation accidentelle de deux espaces entre le «porteur» et le jeton d'accès dans mon en-tête d'autorisation.

Incorrect:

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

Correct:

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

Erreur simple, mais il a fallu un certain temps pour le trouver.

CONTE
la source
2

Dans mon cas, je n'initialisais pas Stripe SDK avec la clé API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

En cas d'opération Stripe, nous pouvons imprimer le journal des erreurs, il est facile à comprendre.

        print(error.debugDescription)
préétam
la source
1

OK, j'ai eu cette erreur et je me suis battu avec elle pendant longtemps (des années) en interagissant avec mon application Ruby on Rails.

J'avais des informations d'identification par défaut configurées comme décrit dans la réponse acceptée, mais j'ai toujours l'erreur et je me suis appuyée sur une réponse didReceiveChallenge pour fournir les informations d'identification - heureusement, cela a fonctionné comme une solution.

Mais! Je viens de trouver la solution!

Je travaillais sur l'intuition que les champs protectedSpace ne correspondaient pas au défi d'autorisation du serveur Ruby on Rails - et j'ai regardé dans le champ de royaume, qui semblait être le seul à ne pas être défini.

J'ai commencé par imprimer les en-têtes de réponse du serveur, et bien que j'aie pu les examiner, ils n'incluaient pas le champ WWW-Authorization qui aurait inclus le champ realm.

Je pensais que c'était peut-être parce que mon application Rails ne spécifiait pas le domaine, alors j'ai commencé à regarder le côté Rails des choses.

J'ai trouvé que je pouvais spécifier le domaine dans l'appel à,

authenticate_or_request_with_http_basic

... que j'utilise pour l'authentification HTTP Basic.

Je ne spécifiais pas déjà un royaume, alors j'en ai ajouté un,

authenticate_or_request_with_http_basic("My Rails App")

J'ai ensuite ajouté la chaîne correspondante au protectionSpace,

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

Voila! Cela a fonctionné, et je n'ai plus le,

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

Même après avoir spécifié le domaine dans l'application Rails, je ne le vois toujours pas passé dans l'en-tête HTTP, je ne sais pas pourquoi, mais au moins cela fonctionne.

Cisailles
la source
1
Très heureux d'avoir trouvé votre réponse, cela m'effrayait vraiment.
ggrana
0

L'erreur peut également être causée par une politique de sécurité du contenu (CSP) qui peut être trop restrictive. Dans notre cas, nous avions besoin d'un CSP plus ou moins complètement ouvert et permettant tout. Gardez à l'esprit que l'ouverture du CSP peut être un problème de sécurité majeur (en fonction de ce que vous faites exactement dans l'application).

Raphael
la source
0

J'ai eu ce problème lorsque j'ai essayé d'ouvrir une page http dans une vue Web. Mais cette page contenait un popup qui a été ouvert en premier.

Lorsque l'équipe backend a supprimé ce popup, tout est devenu OK.

Serge Maslyakov
la source
-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
la source