CredStore 执行查询错误

我遇到了一个问题,而做 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 中的作用是什么?

58079 次浏览

试图从 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)

and the error goes away next time you try to retrieve the credential.

我有点迷茫,因为我不知道是什么原因造成的,或什么 CredStore 在 iOS 中的作用是什么?

IOS 上的凭证存储允许用户将基于证书或基于密码的凭证临时或永久地存储在设备的钥匙链上。

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

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

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

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>

小心 ,因为它允许从应用程序连接到任何服务器。在继续之前,请阅读有关应用程序传输安全性的更多信息。参见@kezi 的评论

在我的例子中,我没有使用 API 键初始化 StripeSDK。

        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 头中的某些令牌执行 API 请求,那么可能根本不需要凭据存储。因此我们可以根据我们的要求禁用它:

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


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

更改后没有错误。

我得到这个错误的原因是由于我不小心使用两个空格之间的“承载者”和访问令牌在我的授权标头。

错误:

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

正确:

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

很简单的错误,但是花了很长时间才找到。

OK, I had this error, and fought with it for a long time (years) when interacting with my Ruby on Rails app.

我按照已接受的答案中的描述设置了缺省凭据,但仍然得到了错误,并且一直依赖 did ReceiveChallenge 响应来提供凭据——幸运的是,这种方法可以解决这个问题。

但是,我刚刚找到了解决办法!

我的直觉告诉我,protected 的 Space 字段与 Ruby on Rails 服务器的 Authorization 挑战不匹配,于是我查看了 domain 字段,它似乎是唯一一个没有定义的字段。

我首先打印出服务器响应头,尽管我能够检查这些,但是它们没有包括 WWW-Authorization 字段,而这个字段应该包括 domain 字段。

我想这可能是因为我的 Rails 应用程序没有指定领域,所以我开始关注 Rails 方面的事情。

I found I could specify the realm in the call to,

authenticate_or_request_with_http_basic

我用它来进行 HTTP 基本认证。

我还没有指定领域,所以添加了一个,

authenticate_or_request_with_http_basic("My Rails App")

I then added the corresponding string to the 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 头中传递,我不知道为什么,但至少它工作了。

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

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

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

我遇到的问题是对一个正在通过休息调用发送的图像进行 base64编码

我以前用过

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

But 50% of the time I would get the error above.

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

 let strBase64 = imageData.base64EncodedString()

Twitter 登录也有同样的问题,结果我用错了 API 密钥。

我移除 .cURLDescription on

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
}