CredStore 执行查询错误

CredStore Perform Query error

我 运行 在对我的应用程序后端进行 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 中的作用是什么?

尝试从 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;
}

给它一个保护凭证space:

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

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

下次您尝试检索凭据时错误就会消失。

I am a little lost as I am not sure what is causing this, or what CredStore even does. What purpose does CredStore serve in iOS?

iOS 上的凭据存储允许用户将设备上基于证书或基于密码的凭据安全地临时或永久地存储到钥匙串中。

我怀疑您的后端服务器上有某种身份验证,并且该服务器正在请求对您的应用程序进行身份验证质询(不存在凭据)。

可能可以安全地忽略它,因为从 URLCredentialStorage 返回 nil 是一个有效的响应

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

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

let url = URL(string: myUrl)

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

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

小心,因为这样可以从您的应用程序连接到任何服务器。在继续之前阅读更多关于 App Transport Security 的信息。请参阅@kezi

的评论

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

        STPPaymentConfiguration.shared().publishableKey = publishableKey

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

        print(error.debugDescription)

如果出现此错误,在使用 AVPlayer 时,只需在主线程上调用 .play()

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

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

所以只需在URL

末尾加上“/”
https://example.com/api/devices/

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

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

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

这样更改后没有错误。

我收到此错误的原因是我在授权 header.

中不小心在 "Bearer" 和访问令牌之间使用了两个空格

不正确:

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

正确:

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

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

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

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

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

我预感 protectedSpace 字段与 Rails 服务器上 Ruby 的授权质询不匹配 - 我查看了 realm 字段,这似乎是只有一个未定义。

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

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

当后端团队删除这个弹出窗口时,一切都正常了。

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

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

我以前用过

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

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

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

 let strBase64 = imageData.base64EncodedString()

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

我删除了.cURLDescription

AF.request(url)

那个日志不见了

在使用 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
    }