【问题标题】:CredStore Perform Query errorCredStore 执行查询错误
【发布时间】:2018-02-16 09:41:42
【问题描述】:

我在对我的应用后端进行 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 beta 6 的模拟器中有相同的日志。我希望这只是因为 beta
  • 你没有找到解决办法吗?
  • @swalkner 还没有,仍在尝试了解更多信息。
  • 我也有同样的问题。有消息吗?
  • 你在播放视频吗?

标签: ios xcode9


【解决方案1】:

当尝试从 URLCredentialStorage 检索未知 URLProtectionSpaceURLCredential 时,会发生此错误。 例如

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 返回 nil 是一个有效的响应

【讨论】:

  • 你将如何创建一个保护空间?
  • @Brett 你能提供 protectionSpace 的信息吗?
  • 在Moya和Alamofire中如何使用?
  • 我在使用 alamofire stackoverflow.com/questions/50342214/… 时也遇到了这个问题,我不知道在 Alamofire 中将 userCredential 放在哪里:(
  • @Brett,我在通过 AFNetwrking 调用 Twilio API 时也遇到了这个问题。有什么建议,搜索什么来解决 AFNetworking 的问题?
【解决方案2】:

我不确定为什么在使用 Alamofire 执行请求时会出现此错误,但如果您使用 HTTP 标头中的某些令牌执行 API 请求,您可能根本不需要凭证存储。所以我们可以为我们的请求禁用它:

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

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

更改后没有错误。

【讨论】:

    【解决方案3】:

    同样的问题发生在我身上,我发现如果您的 API URL 在 URL 的末尾不包含“/”,那么 iOS 不会向服务器发送“授权”值。因此,您将在控制台中看到一条消息,如已发布的问题。

    所以只需在 URL 末尾添加“/”

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

    【讨论】:

    • 谢谢!为我工作,但这是为什么呢?
    【解决方案4】:

    就我而言,我没有使用 API 密钥初始化 Stripe SDK。

            STPPaymentConfiguration.shared().publishableKey = publishableKey
    

    如果有任何Stripe操作,我们可以打印错误日志,很容易理解。

            print(error.debugDescription)
    

    【讨论】:

      【解决方案5】:

      这是传输错误,让我们在plist文件中添加这样的传输权限:

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

      小心,因为这样可以从您的应用程序连接到任何服务器。在继续之前阅读有关应用程序传输安全性的更多信息。查看@kezi 的评论

      【讨论】:

      • 我不知道为什么这会被否决,这个解决方案帮助了我!我通过 FRadioPlayer github.com/fethica/FRadioPlayer 遇到了音频流问题
      • @caffeinum 因为这消除了任何安全性。这不是软件的错误。添加此功能是为了为您的应用提供保护屏障。这个答案没有说明这一点或任意负载的含义。
      • Apple 的应用审查可能会标记这一点,并且您会被问到为什么您的应用需要连接到任意主机。如果他们不喜欢您的回答,他们可能会拒绝该应用。最好为您尝试连接的特定主机名添加密钥。
      【解决方案6】:

      我编辑了包含 URL 的字符串来解决这个问题:

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

      【讨论】:

        【解决方案7】:

        如果你得到这个错误,当使用 AVPlayer 时,只需在主线程上调用 .play()

        【讨论】:

        • 使用 AVPlayer - 我不是调用播放,而是加载资产,然后调用暂停,但仍然收到此警告。
        【解决方案8】:

        我收到此错误的原因是我不小心在我的授权标头中的“承载”和访问令牌之间使用了两个空格。

        不正确:

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

        正确:

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

        简单的错误,但花了一段时间才找到它。

        【讨论】:

          【解决方案9】:

          好的,我遇到了这个错误,并且在与我的 Ruby on Rails 应用程序交互时与它斗争了很长时间(几年)。

          我已按照接受的答案中的描述设置了默认凭据,但仍然出现错误,并且一直依赖 didReceiveChallenge 响应来提供凭据 - 幸运的是,这是一种解决方法。

          但是!我刚刚找到了解决方案!

          我有一种预感,即 protectedSpace 字段与来自 Ruby on Rails 服务器的授权挑战不匹配 - 我查看了 realm 字段,这似乎是唯一未定义的字段。

          我首先打印出服务器响应标头,虽然我能够检查这些标头,但它们没有包含本来应该包含领域字段的 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 标头中传递,我不知道为什么,但至少它有效。

          【讨论】:

          • 很高兴找到你的答案,真的把我吓坏了。
          【解决方案10】:

          该错误也可能是由过于严格的内容安全策略 (CSP) 引起的。在我们的案例中,我们需要一个或多或少完全开放并允许一切的 CSP。请记住,打开 CSP 可能是一个严重的安全问题(具体取决于您在应用中执行的操作)。

          【讨论】:

            【解决方案11】:

            当我尝试在 web 视图中打开 http 页面时遇到了这个问题。但是这个页面包含一个首先打开的弹出窗口。

            当后端团队移除此弹出窗口时,一切正常。

            【讨论】:

              【解决方案12】:

              我的问题是通过 rest 调用发送的图像的 base64 编码

              我以前用过

              let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
              

              但有 50% 的时间我会收到上述错误。

              我改用以下解决了我的问题...

               let strBase64 = imageData.base64EncodedString()
              

              【讨论】:

                【解决方案13】:

                在 Twitter 登录时遇到同样的问题。原来我使用了错误的 API 密钥。

                【讨论】:

                  【解决方案14】:

                  我删除.cURLDescription

                  AF.request(url)
                  

                  那个日志不见了

                  【讨论】:

                    【解决方案15】:

                    在使用 Stripe IOS SDK 时,我发现我应该添加来自 stripe 的可发布密钥。

                    这是在 AppDelegate 中设置的,如 https://stripe.com/docs/development/quickstart,步骤 2 中所示。

                    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
                            StripeAPI.defaultPublishableKey = "pk_test_....."
                            return true
                        }
                    
                    

                    【讨论】:

                      【解决方案16】:
                          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)
                           }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-12-17
                        • 2012-12-29
                        • 1970-01-01
                        • 1970-01-01
                        • 2022-01-12
                        • 2020-04-11
                        • 1970-01-01
                        相关资源
                        最近更新 更多