CredStore Thực hiện truy vấn lỗi


109

Tôi đang gặp sự cố khi thực hiện lệnh gọi API đến phần phụ trợ ứng dụng của mình, mọi kết nối hiện đều nhắc

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

Tôi hơi mất hứng vì không biết chắc điều gì đang gây ra điều này hoặc những gì CredStore làm. CredStore phục vụ mục đích gì trong iOS?


Tôi gặp cùng log trong mô phỏng sử dụng iOS 11 + Xcode beta 6. Tôi hy vọng điều này chỉ là vì các phiên bản beta
nacho4d

bạn đã không bao giờ tìm thấy một giải pháp cho điều này?
swalkner 21/09/17

@swalkner thì chưa, vẫn đang cố gắng tìm hiểu thêm.
Anthony Taylor

Tôi có cùng một vấn đề. Có tin tức gì không?
Alexander Perechnev

Bạn đang phát video?
Daniel Storm

Câu trả lời:


34

Lỗi này xảy ra khi cố gắng truy xuất URLCredentialtừ URLCredentialStoragekhông xác định URLProtectionSpace. ví dụ

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

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

sản xuất

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

Cung cấp cho nó một thông tin xác thực cho không gian bảo vệ:

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

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

và lỗi sẽ biến mất vào lần tiếp theo bạn cố gắng truy xuất thông tin đăng nhập.

Tôi hơi mất hứng vì không biết chắc điều gì đang gây ra điều này hoặc những gì CredStore làm. CredStore phục vụ mục đích gì trong iOS?

Lưu trữ thông tin xác thực trên iOS cho phép người dùng lưu trữ an toàn thông tin đăng nhập dựa trên chứng chỉ hoặc mật khẩu trên thiết bị tạm thời hoặc vĩnh viễn vào chuỗi khóa.

Tôi nghi ngờ rằng bạn có một số loại xác thực trên máy chủ phụ trợ của mình và máy chủ đó đang yêu cầu một thử thách xác thực đối với ứng dụng của bạn (mà không có thông tin xác thực nào tồn tại).

Nó có thể được bỏ qua một cách an toàn vì trả về nil từ URLCredentialStoragelà một phản hồi hợp lệ


2
Bạn sẽ làm thế nào về việc tạo ra một không gian bảo vệ?
Tom Fox,

@Brett bạn có thể vui lòng cung cấp thông tin cho ProtectionSpace được không?
Pavlos

2
làm thế nào để sử dụng trong Moya và Alamofire?
sony

1
Tôi cũng gặp sự cố này khi sử dụng alamofire stackoverflow.com/questions/50342214/… , tôi không biết phải đặt userCredential ở đâu trong Alamofire :(
Alexa289.

1
@Brett, tôi cũng đang gặp phải vấn đề này khi gọi API Twilio thông qua AFNetwrking. Bất kỳ đề xuất nào, cần tìm kiếm gì để giải quyết vấn đề với AFNetworking?
Sunita

8

Tôi không chắc tại sao chúng tôi gặp lỗi này khi thực hiện yêu cầu với Alamofire, nhưng nếu bạn thực hiện yêu cầu API với một số mã thông báo trong tiêu đề HTTP, bạn có thể không cần lưu trữ thông tin đăng nhập. Vì vậy, chúng tôi có thể vô hiệu hóa nó theo yêu cầu của chúng tôi:

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

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

Không có lỗi sau khi thay đổi như vậy.


4

Đây là lỗi truyền tải, hãy thêm quyền truyền tải như thế này trong tệp plist:

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

Hãy cẩn thận vì điều đó cho phép kết nối với bất kỳ máy chủ nào từ ứng dụng của bạn. Đọc thêm về Bảo mật truyền tải ứng dụng trước khi tiếp tục. Xem bình luận của @kezi


Tôi không biết tại sao điều này lại nhận được lượt phản đối, giải pháp này đã giúp tôi! Tôi đã gặp sự cố với dòng âm thanh qua FRadioPlayer github.com/fethica/FRadioPlayer
caffeinum

8
@caffeinum Bởi vì điều này loại bỏ bất kỳ bảo mật nào từ trước đến nay. Đây không phải là lỗi của phần mềm. Điều này được thêm vào để tạo hàng rào bảo vệ cho ứng dụng của bạn. Câu trả lời này không nói gì về điều đó hoặc tải tùy ý có nghĩa là gì.
keji

Bài đánh giá ứng dụng của Apple có thể sẽ gắn cờ điều này và bạn sẽ được hỏi tại sao ứng dụng của bạn cần kết nối với các máy chủ tùy ý. Họ có thể từ chối ứng dụng nếu họ không thích câu trả lời của bạn. Sẽ tốt hơn nhiều nếu thêm khóa cho tên máy chủ cụ thể mà bạn đang cố kết nối.
Jens Alfke

4

Vấn đề tương tự cũng xảy ra với tôi và tôi nhận thấy rằng nếu URL API của bạn không chứa "/" ở cuối URL thì iOS không gửi giá trị "Ủy quyền" đến máy chủ. Do đó, bạn sẽ thấy một thông báo như đã đăng được đề cập trong bảng điều khiển.

Vì vậy, chỉ cần thêm "/" vào cuối URL

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

2

Tôi đã chỉnh sửa Chuỗi chứa URL để khắc phục sự cố này:

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

let url = URL(string: myUrl)

2

Nếu bạn gặp lỗi này, khi sử dụng AVPlayer, chỉ cần gọi .play () trên chuỗi chính


Với AVPlayer - tôi không gọi phát nhưng tải nội dung rồi tạm dừng cuộc gọi, nhưng vẫn nhận được cảnh báo này.
Jonny

2

Nguyên nhân khiến tôi gặp lỗi này là do tôi vô tình sử dụng hai khoảng trắng giữa "Bearer" và mã thông báo truy cập trong tiêu đề Ủy quyền của mình.

Sai:

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

Chính xác:

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

Sai lầm đơn giản nhưng phải mất một thời gian mới tìm ra được.


2

Trong trường hợp của tôi, tôi đã không khởi chạy Stripe SDK bằng khóa API.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

Trong trường hợp có bất kỳ hoạt động Stripe nào, chúng tôi có thể in nhật ký lỗi, rất dễ hiểu.

        print(error.debugDescription)

1

OK, tôi đã gặp lỗi này và đã chiến đấu với nó trong một thời gian dài (nhiều năm) khi tương tác với ứng dụng Ruby on Rails của tôi.

Tôi đã thiết lập thông tin đăng nhập mặc định như được mô tả trong câu trả lời được chấp nhận, nhưng vẫn gặp lỗi và đang dựa vào phản hồi didReceiveChallenge để cung cấp thông tin đăng nhập - rất may là điều đó đã hoạt động bình thường.

Nhưng! Tôi vừa tìm ra giải pháp!

Tôi đang làm việc với linh cảm rằng các trường protectedSpace không phù hợp với thử thách Cấp quyền từ máy chủ Ruby on Rails - và tôi đã xem xét trường cảnh giới, dường như là trường duy nhất chưa được xác định.

Tôi bắt đầu bằng cách in ra các tiêu đề phản hồi của máy chủ và mặc dù tôi có thể kiểm tra các tiêu đề này, chúng không bao gồm trường WWW-Authorization mà sẽ bao gồm trường cảnh giới.

Tôi nghĩ điều này có thể là do ứng dụng Rails của tôi không chỉ rõ lĩnh vực, vì vậy tôi bắt đầu xem xét khía cạnh Rails của mọi thứ.

Tôi thấy tôi có thể chỉ định lĩnh vực trong cuộc gọi tới,

authenticate_or_request_with_http_basic

... mà tôi đang sử dụng để xác thực HTTP cơ bản.

Tôi đã không chỉ định một cảnh giới, vì vậy hãy thêm một cảnh giới,

authenticate_or_request_with_http_basic("My Rails App")

Sau đó, tôi đã thêm chuỗi tương ứng vào ProtectionSpace,

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

Thì đấy! Điều đó đã hiệu quả và tôi không còn nhận được

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

Ngay cả sau khi chỉ định lĩnh vực trong ứng dụng Rails, tôi vẫn không thấy nó được truyền trong tiêu đề HTTP, tôi không biết tại sao, nhưng ít nhất nó hoạt động.


1
Rất vui khi tìm thấy câu trả lời của bạn, nó thực sự làm tôi bối rối.
ggrana

0

Lỗi cũng có thể do Chính sách bảo mật nội dung (CSP) có thể quá hạn chế. Trong trường hợp của chúng tôi, chúng tôi cần một CSP ít nhiều hoàn toàn mở và cho phép mọi thứ. Hãy nhớ rằng việc mở CSP có thể là một vấn đề bảo mật lớn (tùy thuộc vào chính xác những gì bạn đang làm trong ứng dụng).


0

Tôi gặp sự cố này khi cố gắng mở trang http bên trong chế độ xem web. Nhưng trang này có một cửa sổ bật lên được mở trước.

Khi nhóm phụ trợ xóa cửa sổ bật lên này, mọi thứ trở nên OK.


-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)
     }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.