CredStore Sorgu Gerçekleştirme hatası


109

Uygulamalarımın arka ucuna API çağrıları yaparken bir sorunla karşılaşıyorum, artık her bağlantı ile

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

Buna neyin neden olduğundan veya CredStore'un ne yaptığından emin olmadığım için biraz kayboldum. CredStore, iOS'ta hangi amaca hizmet ediyor?


İOS

buna bir çözüm bulamadın mı?
swalkner

@swalkner henüz değil, hala daha fazlasını öğrenmeye çalışıyor.
Anthony Taylor

Bende de aynı sorun var. Haber var mı?
Alexander Perechnev

Bir video mu oynatıyorsun
Daniel Storm

Yanıtlar:


34

Bir alınmaya çalışılırken, bu hata oluşur URLCredentialgelen URLCredentialStoragebir bilinmeyeni URLProtectionSpace. Örneğin

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

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

üretir

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

Koruma alanı için bir kimlik bilgisi verin:

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

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

ve kimlik bilgilerini tekrar almaya çalıştığınızda hata ortadan kalkar.

Buna neyin neden olduğundan veya CredStore'un ne yaptığından emin olmadığım için biraz kayboldum. CredStore, iOS'ta hangi amaca hizmet ediyor?

İOS'ta kimlik bilgileri depolaması, kullanıcıların sertifika tabanlı veya parola tabanlı kimlik bilgilerini cihazda geçici veya kalıcı olarak anahtar zincirine güvenli bir şekilde depolamasına olanak tanır.

Arka uç sunucunuzda bir tür kimlik doğrulaması bulunduğundan ve bu sunucunun uygulamanıza yönelik bir kimlik doğrulama sorgulaması istediğinden şüpheleniyorum (bunun için kimlik bilgisi mevcut değil).

'Den sıfır döndürmek URLCredentialStoragegeçerli bir yanıt olduğu için büyük olasılıkla güvenli bir şekilde göz ardı edilebilir


2
Bir koruma alanı yaratmaya nasıl devam edersiniz?
Tom Fox

@Brett, lütfen koruma alanı için bilgi verebilir misiniz?
Pavlos

2
Moya ve Alamofire'da nasıl kullanılır?
sony

1
Alamofire stackoverflow.com/questions/50342214/… kullanırken de bu sorunu yaşıyorum, alamofire'da userCredential'ı nereye koyacağımı bilmiyorum :(
Alexa289

1
@Brett, Twilio API'yi AFNetwrking üzerinden çağırırken de bu sorunla karşılaşıyorum. Herhangi bir öneriniz, sorunu AFNetworking ile kapmak için ne aranmalı?
Sunita

8

Alamofire ile istekler gerçekleştirirken neden bu hatayı alıyoruz emin değilim, ancak HTTP başlıklarında bazı belirteçlerle API istekleri yaparsanız, kimlik bilgileri deposuna hiç ihtiyacınız olmayabilir. Böylece isteğimiz için onu devre dışı bırakabiliriz:

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

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

Böyle bir değişiklikten sonra hata yok.


4

Bu taşıma hatasıdır, plist dosyasına şöyle bir taşıma izni ekleyelim:

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

Uygulamanızdan herhangi bir sunucuya bağlantı sağladığından dikkatli olun . Devam etmeden önce App Transport Security hakkında daha fazla bilgi edinin. @Kezi tarafından yapılan yoruma bakın


Bunun neden olumsuz oy aldığını bilmiyorum, bu çözüm bana yardımcı oldu! FRadioPlayer github.com/fethica/FRadioPlayer üzerinden ses akışı
caffeinum

8
@caffeinum Çünkü bu, her türlü güvenliği ortadan kaldırır. Bu, yazılım tarafında bir hata değildir. Bu, uygulamanıza bir koruma engeli sağlamak için eklenir. Bu cevap, bunun veya keyfi yüklerin ne anlama geldiğiyle ilgili hiçbir şey söylemiyor.
keji

Apple'ın uygulama incelemesi muhtemelen bunu işaretler ve uygulamanızın neden rastgele ana bilgisayarlara bağlanması gerektiği sorulur. Cevabınızı beğenmezlerse uygulamayı reddedebilirler. Bağlanmaya çalıştığınız belirli ana bilgisayar adı için bir anahtar eklemek çok daha iyidir.
Jens Alfke

4

Aynı sorun benim de başıma geliyor ve API URL'niz URL'nin sonunda bir "/" içermiyorsa, iOS'un sunucuya "Yetkilendirme" değeri göndermediğini fark ettim. Konsolda söz konusu mesaja benzer bir mesaj göreceğiniz için.

Dolayısıyla, URL'nin sonuna "/" eklemeniz yeterlidir

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

2

Bu sorunu gidermek için URL'yi içeren Dizeyi düzenledim:

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

let url = URL(string: myUrl)

2

Bu hatayı alırsanız, AVPlayer kullanırken, ana iş parçacığında .play () çağırın.


AVPlayer ile - Oynatmayı değil varlıkları yüklüyor ve ardından duraklatmayı çağırıyorum, ancak yine de bu uyarıyı alıyorum.
Jonny

2

Bu hatayı almamın nedeni, Yetkilendirme başlığımdaki "Taşıyıcı" ile erişim belirteci arasında yanlışlıkla iki boşluk kullanmamdı.

Yanlış:

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

Doğru:

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

Basit bir hata, ama bulması biraz zaman aldı.


2

Benim durumumda, Stripe SDK'yı API anahtarıyla başlatmıyordum.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

Herhangi bir Stripe işlemi durumunda, anlaşılması kolay olan hata günlüğünü yazdırabiliriz.

        print(error.debugDescription)

1

Tamam, bu hatayı aldım ve Ruby on Rails uygulamamla etkileşim kurarken uzun süre (yıllar) onunla savaştım.

Kabul edilen yanıtta açıklandığı gibi ayarlanmış varsayılan kimlik bilgilerim vardı, ancak yine de hatayı alıyorum ve kimlik bilgilerini sağlamak için bir didReceiveChallenge yanıtına güveniyorum - neyse ki bu bir çözüm olarak çalıştı.

Fakat! Çözümü şimdi buldum!

Korunan Alan alanlarının Ruby on Rails sunucusundaki Yetkilendirme zorluğuyla eşleşmediğine dair bir önsezi üzerinde çalışıyordum ve tanımsız kalan tek alan gibi görünen bölge alanına baktım.

Sunucu yanıt başlıklarını yazdırarak başladım ve bunları inceleyebilsem de, bölge alanını içerecek olan WWW-Yetkilendirme alanını içermediler.

Bunun belki de Rails uygulamamın bölgeyi belirtmemesinden kaynaklandığını düşündüm, bu yüzden şeylerin Rails tarafına bakmaya başladım.

Çağrıda bölgeyi belirleyebileceğimi buldum,

authenticate_or_request_with_http_basic

... HTTP Temel kimlik doğrulaması için kullanıyorum.

Zaten bir bölge belirtmiyordum, bu yüzden bir tane ekledim,

authenticate_or_request_with_http_basic("My Rails App")

Daha sonra ilgili dizeyi protectionSpace'e ekledim,

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

Voila! Bu işe yaradı ve artık anlamıyorum

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

Rails uygulamasında alanı belirttikten sonra bile, hala HTTP başlığında geçtiğini görmüyorum, nedenini bilmiyorum ama en azından işe yarıyor.


1
Cevabınızı bulduğuma çok sevindim, beni gerçekten korkutuyordu.
ggrana

0

Hata, çok kısıtlayıcı olabilecek bir İçerik Güvenliği Politikasından (CSP) de kaynaklanıyor olabilir. Bizim durumumuzda, aşağı yukarı tamamen açık ve her şeye izin veren bir CSP'ye ihtiyacımız vardı. CSP'yi açmanın harika bir güvenlik sorunu olabileceğini unutmayın (uygulamada tam olarak ne yaptığınıza bağlı olarak).


0

Bir web görünümünde bir http sayfasını açmaya çalıştığımda bu sorunu yaşadım. Ancak bu sayfa önce açılan bir pop-up içeriyordu.

Arka uç ekibi bu açılır pencereyi kaldırdığında her şey yoluna girdi.


-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)
     }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.