Подтвердить что ты не робот

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

У меня возникает проблема при выполнении вызовов 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?

4b9b3361

Ответ 1

Эта ошибка возникает при попытке извлечь URLCredential из 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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Ответ 6

Я получил эту ошибку из-за того, что я случайно использовал два пробела между "Носителем" и маркером доступа в моем заголовке авторизации.

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

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

Правильный:

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

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

Ответ 7

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

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

let url = URL(string: myUrl)

Ответ 8

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

        STPPaymentConfiguration.shared().publishableKey = publishableKey

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

        print(error.debugDescription)

Ответ 9

Хорошо, у меня была эта ошибка, и я боролся с ней долгое время (годы) при взаимодействии с моим приложением 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, я не знаю почему, но по крайней мере это работает.

Ответ 10

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

Ответ 11

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

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

Ответ 12

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