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 เบต้า 6 ฉันหวังว่านี่เป็นเพียงเพราะเบต้า
nacho4d

คุณไม่เคยพบวิธีแก้ปัญหานี้หรือ?
swalkner

@swalkner ยังไม่ได้พยายามหาข้อมูลเพิ่มเติม
Anthony Taylor

ผมมีปัญหาเดียวกัน. ข่าวใด ๆ?
Alexander Perechnev

คุณกำลังเล่นวิดีโอหรือไม่?
Daniel Storm

คำตอบ:


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
คุณจะสร้างพื้นที่คุ้มครองอย่างไร
Tom Fox

@Brett กรุณาให้ข้อมูลสำหรับ protectionSpace ได้ไหม?
Pavlos

2
วิธีใช้ใน Moya และ Alamofire?
sony

1
ฉันมีปัญหานี้เช่นกันเมื่อใช้ alamofire stackoverflow.com/questions/50342214/…ฉันไม่รู้ว่าจะใส่ userCredential ใน Alamofire ไว้ที่ไหน :(
Alexa289

1
@Brett ฉันกำลังประสบปัญหานี้เมื่อเรียก Twilio API ผ่าน AFNetwrking มีข้อเสนอแนะอะไรให้ค้นหาเพื่อไขข้อข้องใจกับ AFNetworking?
Sunita

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

นี่คือข้อผิดพลาดในการขนส่งให้เพิ่มการอนุญาตการขนส่งเช่นนี้ในไฟล์ plist:

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

โปรดใช้ความระมัดระวังในการเชื่อมต่อกับเซิร์ฟเวอร์ใด ๆ จากแอปของคุณ อ่านเพิ่มเติมเกี่ยวกับ App Transport Security ก่อนดำเนินการต่อ ดูความคิดเห็นโดย @kezi


ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงได้รับการโหวตวิธีนี้ช่วยฉันได้! ฉันมีปัญหากับ audiostream ผ่าน FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum

9
@caffeinum เพราะสิ่งนี้ลบความปลอดภัยใด ๆ ที่เคยมีมา นี่ไม่ใช่ข้อผิดพลาดในส่วนของซอฟต์แวร์ สิ่งนี้ถูกเพิ่มเข้ามาเพื่อเป็นอุปสรรคในการปกป้องแอปของคุณ คำตอบนี้ไม่ได้บอกอะไรเกี่ยวกับสิ่งนั้นหรือความหมายของการโหลดโดยพลการ
keji

การตรวจสอบแอปของ Apple อาจจะตั้งค่าสถานะนี้และคุณจะถูกถามว่าทำไมแอปของคุณจึงต้องเชื่อมต่อกับโฮสต์โดยพลการ พวกเขาอาจปฏิเสธแอปหากไม่ชอบคำตอบของคุณ การเพิ่มคีย์สำหรับชื่อโฮสต์เฉพาะที่คุณพยายามเชื่อมต่อจะดีกว่ามาก
Jens Alfke

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

ในกรณีของฉันฉันไม่ได้เริ่มต้น Stripe SDK ด้วยคีย์ API

        STPPaymentConfiguration.shared().publishableKey = publishableKey

ในกรณีที่มีการใช้งาน Stripe เราสามารถพิมพ์บันทึกข้อผิดพลาดซึ่งเข้าใจง่าย

        print(error.debugDescription)

1

ตกลงฉันมีข้อผิดพลาดนี้และต่อสู้กับมันมาเป็นเวลานาน (ปี) เมื่อโต้ตอบกับแอป Ruby on Rails ของฉัน

ฉันได้ตั้งค่าข้อมูลรับรองเริ่มต้นตามที่อธิบายไว้ในคำตอบที่ยอมรับแล้ว แต่ยังคงได้รับข้อผิดพลาดและอาศัยการตอบสนองของ didReceiveChallenge ในการจัดหาข้อมูลรับรอง - โชคดีที่ทำงานได้ดี

แต่! ฉันเพิ่งค้นพบวิธีแก้ปัญหา!

ฉันกำลังทำงานอยู่ในลางสังหรณ์ว่าเขตข้อมูลพื้นที่ป้องกันไม่ตรงกับความท้าทายในการอนุญาตจากเซิร์ฟเวอร์ Ruby on Rails - และฉันมองเข้าไปในเขตข้อมูลขอบเขตซึ่งดูเหมือนจะเป็นเพียงช่องเดียวที่ไม่ได้กำหนดไว้

ฉันเริ่มต้นด้วยการพิมพ์ส่วนหัวการตอบกลับของเซิร์ฟเวอร์และแม้ว่าฉันจะสามารถตรวจสอบสิ่งเหล่านี้ได้ แต่ก็ไม่ได้รวมฟิลด์ WWW-Authorization ที่จะรวมฟิลด์ขอบเขตไว้ด้วย

ฉันคิดว่านี่อาจเป็นเพราะแอป 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-page ภายใน web-view แต่หน้านี้มีป๊อปอัปซึ่งเปิดขึ้นก่อน

เมื่อทีมแบ็กเอนด์ลบป๊อปอัปนี้ทุกอย่างก็โอเค


-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)
     }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.