Błąd wykonania zapytania CredStore

109

Mam problem podczas wykonywania wywołań API do zaplecza moich aplikacji, teraz każde połączenie wyświetla monit

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

Jestem trochę zagubiony, ponieważ nie jestem pewien, co to powoduje, ani co robi CredStore. Jaki jest cel CredStore w iOS?

Anthony Taylor
źródło
Mam takie samo logowanie w symulatorze używając iOS 11 + Xcode beta 6. Mam nadzieję, że to tylko z powodu wersji beta
nacho4d
czy nigdy nie znalazłeś rozwiązania tego problemu?
swalkner
@swalkner jeszcze nie, wciąż próbuję dowiedzieć się więcej.
Anthony Taylor
Mam ten sam problem. Jakieś wieści?
Alexander Perechnev
Czy odtwarzasz wideo?
Daniel Storm,

Odpowiedzi:

34

Ten błąd występuje podczas próby pobrania adresu URLCredentialz URLCredentialStoragenieznanego źródła URLProtectionSpace. na przykład

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

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

produkuje

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

Podaj poświadczenie dla obszaru ochrony:

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

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

a błąd znika przy następnej próbie pobrania poświadczenia.

Jestem trochę zagubiony, ponieważ nie jestem pewien, co to powoduje, ani co robi CredStore. Jaki jest cel CredStore w iOS?

Magazyn danych logowania w systemie iOS umożliwia użytkownikom bezpieczne przechowywanie poświadczeń opartych na certyfikatach lub hasłach na urządzeniu tymczasowo lub na stałe w pęku kluczy.

Podejrzewam, że masz jakiś rodzaj uwierzytelniania na serwerze zaplecza i ten serwer żąda żądania uwierzytelnienia w Twojej aplikacji (dla której nie ma poświadczeń).

Prawdopodobnie można to bezpiecznie zignorować, ponieważ zwrócenie nil z wartości URLCredentialStoragejest prawidłową odpowiedzią

Brett
źródło
2
Jak byś się zabrał do stworzenia przestrzeni ochronnej?
Tom Fox
@Brett czy możesz podać informacje dotyczące protectionSpace?
Pavlos
2
jak używać w Moya i Alamofire?
sony
1
Mam również ten problem podczas korzystania z alamofire stackoverflow.com/questions/50342214/… , nie wiem, gdzie umieścić userCredential w Alamofire :(
Alexa289
1
@Brett, mam również ten problem podczas wywoływania Twilio API przez AFNetwrking. Jakieś sugestie, czego szukać, żeby złapać problem z AFNetworking?
Sunita
8

Nie jestem pewien, dlaczego otrzymujemy ten błąd podczas wykonywania żądań z Alamofire, ale jeśli wykonujesz żądania API z jakimś tokenem w nagłówkach HTTP, być może w ogóle nie potrzebujesz magazynu danych logowania. Więc możemy go wyłączyć na naszą prośbę:

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

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

Żadnych błędów po takiej zmianie.

Gleb Tarasov
źródło
4

To jest błąd transportu, dodajmy takie uprawnienia do transportu w pliku plist:

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

Bądź ostrożny ponieważ umożliwia to połączenie z dowolnym serwerem z Twojej aplikacji. Przeczytaj więcej o bezpieczeństwie transportu aplikacji, zanim przejdziesz dalej. Zobacz komentarz @kezi

tuan nguyen
źródło
Nie wiem, dlaczego to dostaje negatywne głosy, to rozwiązanie mi pomogło! Miałem problemy z audiostreamem przez FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum
8
@caffeinum Ponieważ to usuwa wszelkie zabezpieczenia. To nie jest błąd po stronie oprogramowania. Jest to dodawane, aby zapewnić ochronę Twojej aplikacji. Ta odpowiedź nie mówi nic o tym ani o tym, co oznaczają dowolne obciążenia.
keji
Recenzja aplikacji Apple prawdopodobnie oznaczy to i zostaniesz zapytany, dlaczego Twoja aplikacja musi łączyć się z dowolnymi hostami. Mogą odrzucić aplikację, jeśli nie podoba im się Twoja odpowiedź. O wiele lepiej jest dodać klucz dla określonej nazwy hosta, z którym próbujesz się połączyć.
Jens Alfke,
4

Ten sam problem występuje i stwierdziłem, że jeśli adres URL Twojego interfejsu API nie zawiera znaku „/” na końcu adresu URL, system iOS nie wysyła wartości „Autoryzacji” do serwera. Dzięki temu w konsoli pojawi się taka wiadomość jak w pytaniu.

Po prostu dodaj „/” na końcu adresu URL

https://example.com/api/devices/
Iqbal Khan
źródło
2

Edytowałem ciąg zawierający adres URL, aby rozwiązać ten problem:

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

let url = URL(string: myUrl)
Pavlos
źródło
2

Jeśli pojawi się ten błąd, podczas używania AVPlayera, po prostu wywołaj .play () w głównym wątku

Andrey Agapov
źródło
Z AVPlayer - nie wywołuję odtwarzania, ale ładuję zasoby, a następnie wywołuję pauzę, ale nadal otrzymuję to ostrzeżenie.
Jonny
2

Przyczyną pojawienia się tego błędu było przypadkowe użycie dwóch spacji między „Okazicielem” a tokenem dostępu w nagłówku autoryzacji.

Błędny:

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

Poprawny:

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

Prosty błąd, ale znalezienie go zajęło trochę czasu.

OPOWIEŚĆ
źródło
2

W moim przypadku nie inicjowałem Stripe SDK z kluczem API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

W przypadku dowolnej operacji Stripe możemy wydrukować dziennik błędów, jest łatwy do zrozumienia.

        print(error.debugDescription)
preetam
źródło
1

OK, miałem ten błąd i walczyłem z nim przez długi czas (lata) podczas interakcji z moją aplikacją Ruby on Rails.

Miałem domyślne poświadczenia skonfigurowane zgodnie z opisem w zaakceptowanej odpowiedzi, ale nadal otrzymałem błąd i polegałem na odpowiedzi didReceiveChallenge w celu dostarczenia poświadczeń - na szczęście to działało jako obejście.

Ale! Właśnie znalazłem rozwiązanie!

Pracowałem nad przeczuciem, że pola protectedSpace nie odpowiadają wyzwaniu autoryzacji z serwera Ruby on Rails - i zajrzałem do pola dziedziny, które wydawało się być jedynym, które pozostawało niezdefiniowane.

Zacząłem od wydrukowania nagłówków odpowiedzi serwera i chociaż mogłem je sprawdzić, nie zawierały one pola WWW-Authorization, które zawierałoby pole realm.

Pomyślałem, że może to być spowodowane tym, że moja aplikacja Rails nie określała dziedziny, więc zacząłem przyglądać się stronie Railsów.

Odkryłem, że mogę określić w wezwaniu dziedzinę,

authenticate_or_request_with_http_basic

... którego używam do podstawowego uwierzytelniania HTTP.

Nie określałem jeszcze domeny, więc dodałem,

authenticate_or_request_with_http_basic("My Rails App")

Następnie dodałem odpowiedni ciąg do protectionSpace,

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

Voila! To zadziałało i już nie rozumiem,

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

Nawet po określeniu dziedziny w aplikacji Rails, nadal nie widzę jej przekazywanej w nagłówku HTTP, nie wiem dlaczego, ale przynajmniej działa.

Nożyce
źródło
1
Bardzo się cieszę, że znalazłem twoją odpowiedź, naprawdę mnie to przerażało.
ggrana
0

Błąd może być również spowodowany polityką bezpieczeństwa treści (CSP), która może być zbyt restrykcyjna. W naszym przypadku potrzebowaliśmy CSP, który jest mniej lub bardziej otwarty i pozwala na wszystko. Pamiętaj, że otwarcie CSP może stanowić poważny problem z bezpieczeństwem (w zależności od tego, co dokładnie robisz w aplikacji).

Raphael
źródło
0

Wystąpił ten problem, gdy próbowałem otworzyć stronę http w widoku sieci Web. Ale ta strona zawierała wyskakujące okienko, które zostało otwarte jako pierwsze.

Gdy zespół zaplecza usunął to okienko, wszystko stało się OK.

Serge Maslyakov
źródło
-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
źródło