Kesalahan CredStore Perform Query

109

Saya mengalami masalah saat melakukan panggilan API ke backend aplikasi saya, setiap koneksi sekarang diminta

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

Saya sedikit bingung karena saya tidak yakin apa yang menyebabkan ini, atau bahkan apa yang dilakukan CredStore. Apa tujuan CredStore melayani di iOS?

Anthony Taylor
sumber
Saya memiliki log yang sama di simulator menggunakan iOS 11 + Xcode beta 6. Saya harap ini hanya karena beta
nacho4d
apakah Anda tidak pernah menemukan solusi untuk ini?
swalkner
@swalkner belum, masih mencoba mencari tahu lebih lanjut.
Anthony Taylor
Saya memiliki masalah yang sama. Ada berita?
Alexander Perechnev
Apakah Anda memutar video?
Daniel Storm

Jawaban:

34

Kesalahan ini terjadi saat mencoba mengambil URLCredentialdari URLCredentialStorageuntuk yang tidak diketahui URLProtectionSpace. misalnya

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

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

menghasilkan

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

Berikan kredensial untuk ruang perlindungan:

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

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

dan kesalahan hilang saat Anda mencoba mengambil kembali kredensial.

Saya sedikit bingung karena saya tidak yakin apa yang menyebabkan ini, atau bahkan apa yang dilakukan CredStore. Apa tujuan CredStore melayani di iOS?

Penyimpanan kredensial di iOS memungkinkan pengguna untuk menyimpan kredensial berbasis sertifikat atau kata sandi dengan aman di perangkat baik untuk sementara atau secara permanen ke rantai kunci.

Saya menduga Anda memiliki semacam autentikasi di server backend Anda dan server tersebut meminta tantangan autentikasi ke aplikasi Anda (yang tidak memiliki kredensial).

Ini mungkin dapat diabaikan dengan aman karena mengembalikan nil dari URLCredentialStorageadalah respons yang valid

Brett
sumber
2
Bagaimana Anda akan menciptakan ruang perlindungan?
Tom Fox
@Brett dapatkah Anda memberikan informasi untuk protectionSpace?
Pavlos
2
bagaimana cara menggunakannya di Moya dan Alamofire?
sony
1
Saya juga mengalami masalah ini saat menggunakan alamofire stackoverflow.com/questions/50342214/… , saya tidak tahu di mana harus meletakkan userCredential di Alamofire :(
Alexa289
1
@Brett, saya juga menghadapi masalah ini saat memanggil Twilio API melalui AFNetwrking. Ada saran, apa yang harus dicari untuk mengatasi masalah dengan AFNetworking?
Sunita
8

Saya tidak yakin mengapa kami mendapatkan kesalahan ini saat melakukan permintaan dengan Alamofire, tetapi jika Anda melakukan permintaan API dengan beberapa token di header HTTP, Anda mungkin tidak memerlukan penyimpanan kredensial sama sekali. Jadi kami dapat menonaktifkannya untuk permintaan kami:

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

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

Tidak ada kesalahan setelah perubahan tersebut.

Gleb Tarasov
sumber
4

Ini adalah kesalahan pengangkutan, mari tambahkan izin pengangkutan seperti ini di file plist:

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

Berhati-hatilah karena itu memungkinkan koneksi ke server mana pun dari aplikasi Anda. Baca lebih lanjut tentang Keamanan Transportasi Aplikasi sebelum melanjutkan. Lihat komentar oleh @kezi

tuan nguyen
sumber
Saya tidak tahu mengapa ini mendapat suara negatif, solusi ini membantu saya! Saya mengalami masalah dengan audiostream melalui FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum
8
@Caffeinum Karena ini menghilangkan keamanan apa pun. Ini bukan kesalahan dari perangkat lunak. Ini ditambahkan untuk memberikan penghalang perlindungan ke aplikasi Anda. Jawaban ini tidak menjelaskan apa-apa tentang itu atau apa arti beban sewenang-wenang.
keji
Ulasan aplikasi Apple mungkin akan menandai ini dan Anda akan ditanya mengapa aplikasi Anda perlu terhubung ke host sewenang-wenang. Mereka mungkin menolak aplikasi jika tidak menyukai jawaban Anda. Jauh lebih baik menambahkan kunci untuk nama host tertentu yang Anda coba sambungkan.
Jens Alfke
4

Masalah yang sama terjadi pada saya dan saya menemukan bahwa jika URL API Anda tidak mengandung "/" di akhir URL, maka iOS tidak mengirimkan nilai "Otorisasi" ke server. Karena itu Anda akan melihat pesan seperti diposting yang dimaksud di konsol.

Jadi Cukup tambahkan "/" di akhir URL

https://example.com/api/devices/
Iqbal Khan
sumber
2

Saya mengedit String yang berisi URL untuk memperbaiki masalah ini:

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

let url = URL(string: myUrl)
Pavlos
sumber
2

Jika Anda mendapatkan kesalahan ini, saat menggunakan AVPlayer, panggil saja .play () di utas utama

Andrey Agapov
sumber
Dengan AVPlayer - Saya tidak memanggil putar tetapi memuat aset lalu memanggil jeda, tetapi masih mendapat peringatan ini.
Jonny
2

Penyebab saya mendapatkan kesalahan ini adalah karena saya tidak sengaja menggunakan dua spasi antara "Pembawa" dan token akses di header Otorisasi saya.

Salah:

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

Benar:

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

Kesalahan sederhana, tetapi butuh beberapa saat untuk menemukannya.

KISAH
sumber
2

Dalam kasus saya, saya tidak menginisialisasi Stripe SDK dengan kunci API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

Jika ada operasi Stripe, kami dapat mencetak log kesalahan, mudah dimengerti.

        print(error.debugDescription)
preetam
sumber
1

Oke, saya mengalami kesalahan ini, dan berjuang dengannya untuk waktu yang lama (bertahun-tahun) saat berinteraksi dengan aplikasi Ruby on Rails saya.

Saya memiliki kredensial default yang diatur seperti yang dijelaskan dalam jawaban yang diterima, tetapi masih mendapatkan kesalahan, dan telah mengandalkan respons didReceiveChallenge untuk memberikan kredensial - untungnya itu berfungsi sebagai solusi.

Tapi! Saya baru saja menemukan solusinya!

Saya sedang mengerjakan firasat bahwa bidang protectedSpace tidak cocok dengan tantangan Otorisasi dari server Ruby on Rails - dan saya melihat ke bidang ranah, yang tampaknya menjadi satu-satunya yang tidak ditentukan.

Saya mulai dengan mencetak header respons server, dan meskipun saya dapat memeriksanya, mereka tidak menyertakan bidang Otorisasi WWW yang akan menyertakan bidang ranah.

Saya pikir ini mungkin karena aplikasi Rails saya tidak menentukan ranah, jadi saya mulai melihat ke sisi Rails.

Saya menemukan saya dapat menentukan bidang dalam panggilan ke,

authenticate_or_request_with_http_basic

... yang saya gunakan untuk otentikasi HTTP Basic.

Saya belum menentukan ranah, jadi tambahkan satu,

authenticate_or_request_with_http_basic("My Rails App")

Saya kemudian menambahkan string yang sesuai ke protectionSpace,

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

Voila! Itu berhasil, dan saya tidak lagi mendapatkan,

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

Bahkan setelah menentukan ranah di aplikasi Rails, saya masih tidak melihatnya diteruskan di header HTTP, saya tidak tahu mengapa, tapi setidaknya berhasil.

Snips
sumber
1
Sangat senang menemukan jawaban Anda, itu benar-benar membuatku takut.
ggrana
0

Kesalahan juga dapat disebabkan oleh Kebijakan Keamanan Konten (CSP) yang mungkin terlalu membatasi. Dalam kasus kami, kami membutuhkan CSP yang kurang lebih sepenuhnya terbuka dan memungkinkan segalanya. Ingatlah bahwa membuka CSP bisa menjadi masalah keamanan yang hebat (tergantung pada apa yang sebenarnya Anda lakukan di aplikasi).

Raphael
sumber
0

Saya mendapat masalah ini ketika mencoba membuka http-page di dalam web-view. Tapi halaman ini berisi popup yang dibuka lebih dulu.

Ketika tim backend menghapus munculan ini, semuanya menjadi baik-baik saja.

Serge Maslyakov
sumber
-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)
     }
r.chernetsov
sumber