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?

Anthony Taylor
fonte
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

Brett
fonte
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.

Gleb Tarasov
fonte
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

tuan nguyen
fonte
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/
Iqbal Khan
fonte
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)
Pavlos
fonte
2

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

Andrey Agapov
fonte
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.

CONTO
fonte
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)
preetam
fonte
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.

Recortes
fonte
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).

Rafael
fonte
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.

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