web-dev-qa-db-fra.com

CredStore Perform erreur de requête

Je rencontre un problème lorsque je fais des appels API vers le backend de mes applications, chaque connexion demande maintenant

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 CredStore. A quoi sert CredStore dans iOS?

82
Anthony Taylor

Cette erreur se produit lors de la tentative d'extraction d'un URLCredential à partir de URLCredentialStorage pour un URLProtectionSpace. Inconnu, 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 quoi CredStore fait même. À quoi sert CredStore dans iOS?

Le stockage des informations d'identification sur iOS permet aux utilisateurs de stocker de manière sécurisée, de manière temporaire ou permanente, des informations d'identification basées sur un certificat ou sur un mot de passe 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 lequel aucune information d'identification n'existe). 

Il peut probablement être ignoré car renvoyer nil à partir de URLCredentialStorage est une réponse valide

25
Brett

Ceci est une erreur de transport, ajoutons une autorisation de transport comme ceci dans le fichier plist: 

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

Faites attention 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

3
tuan nguyen

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

2
Andrey Agapov

Ce même problème m'arrive et j'ai constaté que si l'URL de votre API ne contient pas "/" à 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.

Donc, ajoutez simplement "/" à la fin de l'URL

https://example.com/api/devices/
1
Iqbal Khan

OK, j’ai eu cette erreur et je me suis battu avec elle pendant longtemps (années) en interagissant avec mon Ruby sur Rails app.

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

Mais! Je viens de trouver la solution!

Je pensais que les champs protectedSpace ne correspondaient pas au défi d’autorisation du serveur Ruby sur Rails et j’ai jeté un œil dans le champ realm, qui semblait être le seul. celui qui était laissé indéfini.

J'ai commencé par imprimer les en-têtes de réponse du serveur, et bien que j'ai 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 royaume, alors j'ai commencé à regarder le côté Rails.

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 à la protectionSpace,

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

Voila! Cela a fonctionné et je ne reçois 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.

1
Snips

J'ai édité 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)
1
Pavlos

L'erreur peut également être provoqué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é important (selon ce que vous faites exactement dans l'application).

0
Raphael

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

        STPPaymentConfiguration.shared().publishableKey = publishableKey

Dans le cas d’une opération Stripe, si nous pouvons imprimer le journal des erreurs, il est facile à comprendre.

        print(error.debugDescription)
0
preetam

Je ne sais pas trop pourquoi cette erreur se produit lorsque nous effectuons des demandes avec Alamofire, mais si vous faites des demandes d'API avec des jetons dans les en-têtes HTTP, vous n'avez peut-être pas besoin du stockage des 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.

0
Gleb Tarasov

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

Incorrect:

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

Correct:

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

Simple erreur, mais il a fallu un certain temps pour la trouver.

0
TALE

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

Lorsque l'équipe principale a supprimé cette fenêtre contextuelle, tout est devenu OK.

0
Serge Maslyakov