Ошибка выполнения запроса CredStore

109

У меня возникла проблема при выполнении вызовов API к серверной части моих приложений, теперь каждое соединение запрашивает

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

Я немного растерялся, так как не уверен, что вызывает это, или что вообще делает CredStore. Какой цели служит CredStore в iOS?

Энтони Тейлор
источник
У меня такой же журнал в симуляторе с использованием iOS 11 + Xcode beta 6. Надеюсь, это только из-за бета-версии
nacho4d
вы никогда не находили решения этого?
swalkner
@swalkner еще нет, все еще пытаюсь узнать больше.
Энтони Тейлор
У меня та же проблема. Любые новости?
Александр Перечнев
Вы проигрываете видео?
Дэниел Сторм,

Ответы:

34

Эта ошибка возникает при попытке получить URLCredentialfrom URLCredentialStorageдля неизвестного URLProtectionSpace. например

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

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

производит

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

Дайте ему учетные данные для области защиты:

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

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

и ошибка исчезнет в следующий раз, когда вы попытаетесь получить учетные данные.

Я немного растерялся, так как не уверен, что вызывает это, или что вообще делает CredStore. Какой цели служит CredStore в iOS?

Хранилище учетных данных на iOS позволяет пользователям безопасно хранить учетные данные на основе сертификатов или паролей на устройстве временно или постоянно в связке ключей.

Я подозреваю, что у вас есть какая-то аутентификация на вашем внутреннем сервере, и этот сервер запрашивает проверку подлинности для вашего приложения (для которого нет учетных данных).

Его, вероятно, можно безопасно проигнорировать, так как возврат nil из URLCredentialStorageявляется допустимым ответом.

Бретт
источник
2
Как бы вы создали пространство защиты?
Tom Fox
@Brett, не могли бы вы предоставить информацию для защиты Space?
Павлос
2
как использовать в Мойе и Аламофайре?
sony
1
У меня также есть эта проблема при использовании alamofire stackoverflow.com/questions/50342214/… , я не знаю, где разместить userCredential в Alamofire :(
Alexa289
1
@Brett, я тоже сталкиваюсь с этой проблемой при вызове Twilio API через AFNetwrking. Есть предложения, что искать, чтобы решить проблему с AFNetworking?
Sunita
8

Я не уверен, почему мы получаем эту ошибку при выполнении запросов с помощью Alamofire, но если вы выполняете запросы API с некоторым токеном в заголовках HTTP, вам может вообще не понадобиться хранилище учетных данных. Поэтому мы можем отключить его по нашему запросу:

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

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

После такого изменения ошибок нет.

Глеб Тарасов
источник
4

Это транспортная ошибка, давайте добавим разрешение на транспорт, как это, в файл plist:

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

Будьте осторожны, так как это позволяет подключиться к любому серверу из вашего приложения. Прежде чем продолжить, прочтите больше о безопасности транспорта приложений. См. Комментарий @kezi

Туан Нгуен
источник
Я не знаю, почему это получает отрицательные голоса, это решение мне помогло! У меня были проблемы с аудиопотоком через FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum
8
@caffeinum Потому что это снимает какую-либо безопасность. Это не ошибка программного обеспечения. Это добавлено, чтобы создать барьер защиты для вашего приложения. Этот ответ ничего не говорит о том, что означает произвольная нагрузка.
keji
Обзор приложения Apple, вероятно, отметит это, и вас спросят, почему ваше приложение должно подключаться к произвольным хостам. Они могут отклонить приложение, если им не понравится ваш ответ. Гораздо лучше добавить ключ для конкретного имени хоста, к которому вы пытаетесь подключиться.
Jens Alfke
4

Эта же проблема случается со мной, и я обнаружил, что если ваш URL-адрес API не содержит «/» в конце URL-адреса, то iOS не отправляет значение «Авторизация» на сервер. Из-за чего вы увидите в консоли сообщение, подобное размещенному в вопросе.

Так что просто добавьте "/" в конец URL

https://example.com/api/devices/
Икбал Хан
источник
2

Я отредактировал строку, содержащую URL-адрес, чтобы исправить эту проблему:

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

let url = URL(string: myUrl)
Павлос
источник
2

Если вы получаете эту ошибку при использовании AVPlayer, просто вызовите .play () в основном потоке

Андрей Агапов
источник
С AVPlayer - я не вызываю воспроизведение, а загружаю ресурсы, а затем вызываю паузу, но все равно получаю это предупреждение.
Джонни
2

Причина, по которой я получаю эту ошибку, связана с тем, что я случайно использовал два пробела между «предъявителем» и токеном доступа в моем заголовке авторизации.

Неправильно:

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

Верный:

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

Простая ошибка, но потребовалось время, чтобы ее найти.

СКАЗКА
источник
2

В моем случае я не инициализировал Stripe SDK с помощью ключа API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

В случае любой операции Stripe мы можем распечатать журнал ошибок, его легко понять.

        print(error.debugDescription)
Preetam
источник
1

Хорошо, у меня была эта ошибка, и я долго (годы) боролся с ней при взаимодействии с моим приложением Ruby on Rails.

У меня были учетные данные по умолчанию, настроенные, как описано в принятом ответе, но все же возникла ошибка, и я полагался на ответ didReceiveChallenge для предоставления учетных данных - к счастью, это сработало.

Но! Я только что нашел решение!

Я работал с подозрением, что поля protectedSpace не соответствуют запросу авторизации с сервера Ruby on Rails - и я заглянул в поле области, которое, казалось, было единственным, которое оставалось неопределенным.

Я начал с распечатки заголовков ответов сервера, и хотя мне удалось их изучить, они не включали поле WWW-авторизации, которое могло бы включать поле области.

Я подумал, что это могло быть потому, что мое приложение Rails не определяло область, поэтому я начал смотреть на Rails сторону вещей.

Я обнаружил, что могу указать область в вызове,

authenticate_or_request_with_http_basic

... который я использую для аутентификации HTTP Basic.

Я еще не указывал область, поэтому добавил ее,

authenticate_or_request_with_http_basic("My Rails App")

Затем я добавил соответствующую строку в ProtectionSpace,

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

Вуаля! Это сработало, и я больше не понимаю,

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

Даже после указания области в приложении Rails я все еще не вижу, чтобы она была передана в заголовке HTTP, я не знаю почему, но, по крайней мере, это работает.

Ножницы
источник
1
Очень рад, что нашел ваш ответ, меня это действительно напугало.
ggrana
0

Ошибка также может быть вызвана политикой безопасности контента (CSP), которая может быть слишком строгой. В нашем случае нам нужен CSP, который более или менее полностью открыт и позволяет все. Имейте в виду, что открытие CSP может стать серьезной проблемой для безопасности (в зависимости от того, что именно вы делаете в приложении).

Рафаэль
источник
0

У меня возникла эта проблема, когда я попытался открыть http-страницу внутри веб-представления. Но на этой странице было всплывающее окно, которое открылось первым.

Когда бэкэнд-команда удалила это всплывающее окно, все стало в порядке.

Серж Масляков
источник
-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)
     }
р.Чернецов
источник