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에서 어떤 용도로 사용됩니까?


나는이 그냥 때문에 베타의 희망 아이폰 OS 11 + 엑스 코드 베타 6를 사용하여 시뮬레이터에서 동일한 로그를 데
nacho4d

이것에 대한 해결책을 찾지 못했습니까?
swalkner

@swalkner 아직 더 알아 보려고 노력 중입니다.
Anthony Taylor

나도 같은 문제가있어. 어떤 소식이라도?
Alexander Perechnev

비디오를 재생하고 있습니까?
Daniel Storm

답변:


34

이 오류 는 알 수없는 URLCredential에서 를 검색하려고 할 때 발생합니다 . 예 :URLCredentialStorageURLProtectionSpace

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의 자격 증명 저장소를 사용하면 사용자가 인증서 기반 또는 암호 기반 자격 증명을 장치에 일시적으로 또는 영구적으로 키 체인에 안전하게 저장할 수 있습니다.

백엔드 서버에 일종의 인증이 있고 해당 서버가 앱에 대한 인증 시도를 요청하고 있다고 생각합니다 (자격 증명이 존재하지 않음).

에서 nil을 반환하는 URLCredentialStorage것이 유효한 응답이므로 무시해도됩니다.


2
보호 공간을 어떻게 만드시겠습니까?
Tom Fox

@Brett protectionSpace에 대한 정보를 제공해 주시겠습니까?
Pavlos

2
Moya 및 Alamofire에서 사용하는 방법?
소니

1
나는 또한 alamofire stackoverflow.com/questions/50342214/…를 사용할 때이 문제가 있습니다. , Alamofire에 userCredential을 어디에 넣을지 모르겠습니다 :(
Alexa289

1
@Brett, AFNetwrking을 통해 Twilio API를 호출 할 때도이 문제가 발생합니다. AFNetworking 문제를 해결하기 위해 무엇을 검색해야합니까?
Sunita

8

Alamofire로 요청을 수행 할 때 왜이 오류가 발생하는지 잘 모르겠지만 HTTP 헤더에서 일부 토큰으로 API 요청을 수행하면 자격 증명 저장소가 전혀 필요하지 않을 수 있습니다. 따라서 요청에 대해 비활성화 할 수 있습니다.

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>

앱에서 모든 서버에 연결할 수 있으므로 주의하십시오 . 계속하기 전에 앱 전송 보안에 대해 자세히 읽어보십시오. @kezi의 댓글보기


왜 이것이 반대표를 받는지 모르겠습니다.이 솔루션이 도움이되었습니다! 나는 FRadioPlayer를 통해 오디오 스트림에 문제가 있었다 github.com/fethica/FRadioPlayer
caffeinum

8
@caffeinum 이것은 보안을 제거하기 때문입니다. 이것은 소프트웨어의 오류가 아닙니다. 이는 앱에 대한 보호 장벽을 제공하기 위해 추가되었습니다. 이 답변은 그것에 대해 또는 임의의 부하가 의미하는 바를 말하지 않습니다.
케지

Apple의 앱 리뷰에서이를 표시 할 것이며 앱이 임의의 호스트에 연결해야하는 이유를 묻는 메시지가 표시됩니다. 답변이 마음에 들지 않으면 앱을 거부 할 수 있습니다. 연결하려는 특정 호스트 이름에 대한 키를 추가하는 것이 훨씬 좋습니다.
Jens Alfke 19

4

이 같은 문제가 나에게 발생하며 API URL에 URL 끝에 "/"가 포함되어 있지 않으면 iOS가 "Authorization"값을 서버로 보내지 않는다는 것을 발견했습니다. 이로 인해 콘솔에 문제가 게시 된 것과 같은 메시지가 표시됩니다.

따라서 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 사용-재생을 호출하지 않고 자산을로드 한 다음 일시 중지를 호출했지만 여전히이 경고가 표시됩니다.
Jonny

2

이 오류가 발생하는 원인은 실수로 Authorization 헤더에서 "Bearer"와 액세스 토큰 사이에 두 개의 공백을 사용했기 때문입니다.

틀림 :

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

옳은:

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

단순한 실수이지만 그것을 찾는 데 시간이 걸렸습니다.


2

제 경우에는 API 키로 Stripe SDK를 초기화하지 않았습니다.

        STPPaymentConfiguration.shared().publishableKey = publishableKey

Stripe 작업의 경우 이해하기 쉬운 오류 로그를 인쇄 할 수 있습니다.

        print(error.debugDescription)

1

좋아,이 오류가 발생하여 Ruby on Rails 앱과 상호 작용할 때 오랫동안 (수년) 싸웠습니다.

수락 된 답변에 설명 된대로 기본 자격 증명을 설정했지만 여전히 오류가 발생했으며 didReceiveChallenge 응답에 의존하여 자격 증명을 제공했습니다. 다행히 해결 방법으로 작동했습니다.

그러나! 방금 해결책을 찾았습니다!

나는 protectedSpace 필드가 Ruby on Rails 서버의 Authorization Challenge와 일치하지 않는다는 직감으로 작업하고 있었고, 정의되지 않은 유일한 영역 인 것 같은 영역 필드를 조사했습니다.

나는 서버 응답 헤더를 인쇄하는 것으로 시작했고, 이것을 조사 할 수 있었지만 영역 필드를 포함했을 WWW-Authorization 필드는 포함하지 않았습니다.

Rails 앱이 영역을 지정하지 않았기 때문일 수 있다고 생각했기 때문에 Rails 측면을 살펴보기 시작했습니다.

호출에서 영역을 지정할 수 있다는 것을 알았습니다.

authenticate_or_request_with_http_basic

... HTTP 기본 인증에 사용하고 있습니다.

이미 영역을 지정하지 않았으므로 하나를 추가했습니다.

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)
     }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.