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 ще не намагається дізнатися більше.
Ентоні Тейлор

У мене така ж проблема. Якісь новини?
Олександр Перечнев

Ви відтворюєте відео?
Даніель Шторм

Відповіді:


34

Ця помилка виникає при спробі витягнути 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 дозволяє користувачам надійно зберігати облікові дані на основі сертифікатів або паролів на пристрої тимчасово або назавжди в брелок.

Я підозрюю, що у вас є якась автентифікація на вашому сервері резервного сервера, і цей сервер запитує ваш додаток для підтвердження автентифікації (для якого немає облікових даних).

Ймовірно, це можна з упевненістю проігнорувати, оскільки повернення нуля від знаку URLCredentialStorageє коректною відповіддю


2
Як би ви вирішили створити захисний простір?
Том Фокс

@Brett чи можете ви надати інформацію для protectionSpace?
Павлос

2
як користуватися Moya та Alamofire?
sony

1
У мене також є це питання при використанні alamofire stackoverflow.com/questions/50342214 / ... , я не знаю , куди помістити UserCredential в Alamofire :(
Alexa289

1
@Brett, я також стикаюся з цим питанням, коли дзвоню API Twilio через AFNetwrking. Будь-які пропозиції, що шукати, щоб схопити проблему за допомогою AFNetworking?
Суніта

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

Це транспортна помилка, додамо такий дозвіл на перевезення, як це у файл плісту:

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

Будьте уважні, оскільки це дозволяє підключитися до будь-якого сервера з вашої програми. Детальніше про безпеку транспорту додатків читайте перед тим, як продовжувати. Дивіться коментар @kezi


Я не знаю, чому це стає зниженим, це рішення допомогло мені! У мене виникли проблеми з аудіо потоком
caffeinum

8
@caffeinum Оскільки це знімає будь-яку безпеку, що коли-небудь. Це не помилка з боку програмного забезпечення. Це додано, щоб забезпечити бар'єр захисту вашому додатку. Ця відповідь нічого не говорить про те чи що означає довільні навантаження.
кеджі

Огляд програми Apple, ймовірно, позначить це, і ви запитаєте, чому ваш додаток потрібно підключати до довільних хостів. Вони можуть відхилити додаток, якщо вам не подобається ваша відповідь. Набагато краще додати ключ для конкретного імені хоста, до якого ви намагаєтесь підключитися.
Єнс Альфке

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

У моєму випадку я не ініціалізував SDK Stripe за допомогою ключа API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

У разі будь-якої операції Stripe, ми можемо надрукувати журнал помилок, його легко зрозуміти.

        print(error.debugDescription)

1

Гаразд, у мене була ця помилка, і я довгий час (роки) боровся з нею під час взаємодії з моїм додатком Ruby on Rails.

У мене були налаштовані облікові дані за замовчуванням, як описано у прийнятій відповіді, але все-таки я отримав помилку і покладався на відповідь didReceiveChallenge щодо надання облікових даних - на щастя, це працювало як обробка.

Але! Я щойно знайшов рішення!

Я працював над уявленням про те, що захищені областіSpace не відповідають виклику авторизації від сервера 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)
     }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.