Ошибка 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?
Ответы
Ответ 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)
}