我在对我的应用后端进行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中的用途是什么?
答案 0 :(得分:26)
尝试从URLCredential
检索URLCredentialStorage
未知URLProtectionSpace
时发生此错误。
e.g。
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是一个有效的响应
答案 1 :(得分:3)
这是传输错误,让我们在plist文件中添加这样的传输权限:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
小心,因为它可以从您的应用中连接到任何服务器。在继续之前,请阅读有关App Transport Security的更多信息。见@kezi的评论
答案 2 :(得分:2)
如果收到此错误,则在使用AVPlayer时,只需在主线程上调用.play()
答案 3 :(得分:2)
我不确定为什么用Alamofire执行请求时为什么会出现此错误,但是如果您使用HTTP标头中的某些令牌进行API请求,则可能根本不需要凭证存储。因此我们可以根据请求将其禁用:
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = ourHeaders
// disable default credential store
configuration.urlCredentialStorage = nil
let manager = Alamofire.SessionManager(configuration: configuration)
...
更改后没有错误。
答案 4 :(得分:1)
我编辑了包含修复此问题的URL的字符串:
var myUrl = "http://myurl.com"
myUrl = myUrl.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!
let url = URL(string: myUrl)
答案 5 :(得分:1)
我遇到了同样的问题,我发现如果您的API URL的URL末尾不包含“ /”,则iOS不会将“授权”值发送到服务器。因此,您将在控制台中看到类似问题的消息。
因此,只需在URL末尾添加“ /”
https://example.com/api/devices/
答案 6 :(得分:1)
出现此错误的原因是由于我不小心在授权标头中的“承载者”和访问令牌之间使用了两个空格。
不正确:
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
正确:
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
简单的错误,但是花了一段时间才找到。
答案 7 :(得分:0)
就我而言,我没有使用API密钥初始化Stripe SDK。
STPPaymentConfiguration.shared().publishableKey = publishableKey
如果执行任何Stripe操作,如果我们可以打印错误日志,则它很容易理解。
print(error.debugDescription)
答案 8 :(得分:0)
该错误也可能是由于内容安全策略(CSP)的限制过于严格所致。就我们而言,我们需要一个或多或少完全开放并允许所有功能的CSP。请记住,打开CSP可能是一个很大的安全问题(取决于您在应用程序中到底在做什么)。
答案 9 :(得分:0)
好的,我遇到了这个错误,并且在与Ruby on Rails应用程序进行交互时已经花了很长时间(多年)。
我已经按照接受的答案中的说明设置了默认凭据,但是仍然出现错误,并且一直依靠didReceiveChallenge响应来提供凭据-幸运的是,它可以解决此问题。
但是!我刚刚找到了解决方案!
我一直在预感,protectedSpace字段与Ruby on Rails服务器的Authorization挑战不匹配-我调查了realm字段,这似乎是唯一一个未定义的字段。
我首先打印出服务器响应标头,尽管我能够检查它们,但它们不包括本应包含领域字段的WWW-Authorization字段。
我认为这可能是因为我的Rails应用程序未指定领域,所以我开始关注Rails方面。
我发现我可以在对的调用中指定领域
authenticate_or_request_with_http_basic
...我正在用于HTTP Basic身份验证。
我还没有指定领域,所以添加了一个领域,
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];
Voila!那行得通,但我不再得到了,
CredStore - performQuery - Error copying matching creds. Error=-25300
即使在Rails应用程序中指定了领域之后,我仍然看不到它在HTTP标头中传递,我也不知道为什么,但是至少它可以工作。
答案 10 :(得分:0)
当我尝试在网络视图中打开一个http页面时遇到了这个问题。但是此页面包含一个首先打开的弹出窗口。
后端团队删除此弹出窗口后,一切正常。
答案 11 :(得分:0)
我的问题是使用 rest 调用发送的图像的 base64 编码
我以前用过
let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
但有 50% 的情况下我会遇到上述错误。
我改用以下内容解决了我的问题...
let strBase64 = imageData.base64EncodedString()
答案 12 :(得分:0)
在 Twitter 登录时遇到了同样的问题。结果我使用了错误的 API 密钥。
答案 13 :(得分:-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)
}