CredStore Perform Query error


109

Estou tendo um problema ao fazer chamadas de API para meu back-end de aplicativos, cada conexão agora exibe

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

Estou um pouco perdido, pois não tenho certeza do que está causando isso, ou o que a CredStore faz. Qual é a finalidade da CredStore no iOS?


Estou tendo o mesmo log no simulador usando iOS 11 + Xcode beta 6. Espero que seja apenas por causa do beta
nacho4d

você nunca encontrou uma solução para isso?
swalkner de

@swalkner ainda não, ainda tentando descobrir mais.
Anthony Taylor

Eu tenho o mesmo problema. Alguma novidade?
Alexander Perechnev

Você está reproduzindo um vídeo?
Daniel Storm

Respostas:


34

Este erro ocorre ao tentar recuperar um URLCredentialde URLCredentialStoragepara um desconhecido URLProtectionSpace. por exemplo

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

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

produz

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

Dê a ele uma credencial para o espaço de proteção:

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

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

e o erro desaparecerá na próxima vez que você tentar recuperar a credencial.

Estou um pouco perdido, pois não tenho certeza do que está causando isso, ou o que a CredStore faz. Qual é a finalidade da CredStore no iOS?

O armazenamento de credenciais no iOS permite que os usuários armazenem com segurança credenciais com base em certificado ou senha no dispositivo, seja temporária ou permanentemente no keychain.

Suspeito que você tenha algum tipo de autenticação em seu servidor de back-end e que o servidor esteja solicitando um desafio de autenticação para seu aplicativo (para o qual não existe credencial).

Provavelmente, ele pode ser ignorado com segurança, pois retornar nulo do URLCredentialStorageé uma resposta válida


2
Como você faria para criar um espaço de proteção?
Tom Fox

@Brett, você pode fornecer informações para o protectionSpace?
Pavlos

2
como usar em Moya e Alamofire?
sony

1
Eu também tenho esse problema ao usar alamofire stackoverflow.com/questions/50342214/… , eu não sei onde colocar userCredential em Alamofire :(
Alexa289

1
@Brett, também estou enfrentando esse problema ao chamar a API Twilio por meio da AFNetwrking. Alguma sugestão, o que pesquisar para pegar o problema com AFNetworking?
Sunita

8

Não sei por que recebemos esse erro ao executar solicitações com Alamofire, mas se você fizer solicitações de API com algum token em cabeçalhos HTTP, talvez não precise de armazenamento de credenciais. Portanto, podemos desativá-lo para nossa solicitação:

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

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

Sem erros após essa mudança.


4

Este é um erro de transporte, vamos adicionar permissão de transporte como esta no arquivo plist:

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

Tenha cuidado, pois isso permite a conexão com qualquer servidor do seu aplicativo. Leia mais sobre segurança de transporte de aplicativos antes de continuar. Veja o comentário de @kezi


Não sei por que isso recebe votos negativos, essa solução me ajudou! Tive problemas com o audiostream via FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum

8
@caffeinum Porque remove qualquer tipo de segurança. Isso não é um erro por parte do software. Isso é adicionado para fornecer uma barreira de proteção ao seu aplicativo. Essa resposta não diz nada sobre isso ou o que significa cargas arbitrárias.
keji

A análise do aplicativo da Apple provavelmente sinalizará isso e você será questionado por que seu aplicativo precisa se conectar a hosts arbitrários. Eles podem rejeitar o aplicativo se não gostarem da sua resposta. É muito melhor adicionar uma chave para o nome de host específico ao qual você está tentando se conectar.
Jens Alfke

4

Esse mesmo problema acontece comigo e descobri que se o URL da API não contiver um "/" no final do URL, o iOS não enviará o valor "Autorização" para o servidor. Devido a isso, você verá uma mensagem como postada em questão no console.

Portanto, basta adicionar "/" no final do URL

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

2

Editei a String que contém o URL para corrigir esse problema:

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

let url = URL(string: myUrl)

2

Se você receber este erro, ao usar o AVPlayer, basta chamar .play () na linha de execução principal


Com o AVPlayer - não estou chamando play, mas carregando recursos e chamando pausa, mas ainda recebo este aviso.
Jonny

2

A causa de ter recebido esse erro foi devido ao uso acidental de dois espaços entre o "Portador" e o token de acesso em meu cabeçalho de autorização.

Incorreta:

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

Corrigir:

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

Erro simples, mas demorou um pouco para encontrá-lo.


2

No meu caso, eu não estava inicializando Stripe SDK com a chave API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

No caso de qualquer operação do Stripe, podemos imprimir o log de erros, é de fácil compreensão.

        print(error.debugDescription)

1

OK, eu tive esse erro e lutei com ele por um longo tempo (anos) ao interagir com meu aplicativo Ruby on Rails.

Eu tinha credenciais padrão configuradas conforme descrito na resposta aceita, mas ainda assim obtive o erro e tenho contado com uma resposta didReceiveChallenge para fornecer as credenciais - felizmente, isso funcionou como uma solução alternativa.

Mas! Acabei de encontrar a solução!

Eu estava trabalhando em um palpite de que os campos protectedSpace não correspondiam ao desafio de autorização do servidor Ruby on Rails - e olhei para o campo de realm, que parecia ser o único que estava sendo deixado indefinido.

Comecei imprimindo os cabeçalhos de resposta do servidor e, embora pudesse examiná-los, eles não incluíam o campo WWW-Authorization que incluiria o campo realm.

Eu pensei que talvez fosse porque meu aplicativo Rails não estava especificando o reino, então comecei a olhar para o lado Rails das coisas.

Eu descobri que poderia especificar o reino na chamada para,

authenticate_or_request_with_http_basic

... que estou usando para autenticação HTTP Basic.

Eu não estava especificando um reino já, então adicionei um,

authenticate_or_request_with_http_basic("My Rails App")

Em seguida, adicionei a string correspondente ao espaço de proteção,

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

Voila! Isso funcionou, e eu não consigo mais

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

Mesmo depois de especificar o realm no aplicativo Rails, ainda não o vejo passado no cabeçalho HTTP, não sei por que, mas pelo menos funciona.


1
Muito feliz por encontrar sua resposta, estava realmente me assustando.
ggrana

0

O erro também pode ser causado por uma Política de Segurança de Conteúdo (CSP) que pode ser muito restritiva. No nosso caso, precisávamos de um CSP mais ou menos totalmente aberto e que permitisse tudo. Lembre-se de que abrir o CSP pode ser um grande problema de segurança (dependendo do que exatamente você está fazendo no aplicativo).


0

Tive esse problema quando tentei abrir uma página http dentro de uma visualização da web. Mas esta página continha um pop-up que foi aberto primeiro.

Quando a equipe de back-end removeu este pop-up, tudo ficou 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)
     }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.