我遇到了一个问题,而这样做的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的目的是什么?
正在尝试从URLCredential
的URLCredentialStorage
未知URLProtectionSpace
时会出现此错误。例如
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是一个有效的响应
该错误也可以通过一个内容安全策略(CSP),可能是过于严格造成的。在我们的例子中,我们需要一个CSP是或多或少完全开放的,允许的一切。请记住,打开CSP可以是一个很大的安全问题(这取决于你的应用程序做什么)。
我得到这个问题,当我试图打开一个网页视图内的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)
}
这是运输的错误,让我们添加的运输许可,像这样的plist文件:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
要小心,因为它使您的应用程序连接到任何服务器。继续之前了解更多关于应用程序的运输保障。见@kezi评论
如果您收到此错误,使用AVPlayer时,只需调用.play()在主线程
我不知道为什么有Alamofire执行请求时,我们得到这个错误,但如果你在HTTP头一些象征性的API请求,你也许并不需要证书存储在所有。因此,我们可以为我们的要求禁用它:
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = ourHeaders
// disable default credential store
configuration.urlCredentialStorage = nil
let manager = Alamofire.SessionManager(configuration: configuration)
...
变更后没有错误。
我编辑包含URL来解决这个问题的字符串:
var myUrl = "http://myurl.com"
myUrl = myUrl.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!
let url = URL(string: myUrl)
同样的问题发生在我身上,我发现,如果你的API URL不包含“/”在URL的末尾,则iOS不发送“授权”值到服务器。由于您将看到一条消息,像张贴在问题在控制台中。
所以,简单地加上“/”在URL的末尾
https://example.com/api/devices/
我得到这个错误的原因是由于我无意使用“承载”和访问令牌之间的两个空间在我的授权头。
不正确:
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
正确:
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
简单的错误,但过了好一会儿找到它。
好吧,我有这个错误,并与我的Ruby on Rails应用程序进行交互时,用它打了很长一段时间(年)。
我不得不默认凭据设置为在接受的答案描述,但仍然得到了错误,并已依托didReceiveChallenge响应提供的凭据 - 幸好周围做过的工作。
但!我刚刚找到了解决办法!
我工作的一种预感,该protectedSpace领域没有从Ruby on Rails的服务器相匹配的授权挑战 - 我看着境界领域,这似乎是正在未定义唯一的一个。
我开始通过打印服务器响应头,虽然我能够研究这些,他们不包括会包含境界领域的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头过去了,我不知道为什么,但至少它的工作原理。
就我而言,我并没有初始化条纹SDK和API密钥。
STPPaymentConfiguration.shared().publishableKey = publishableKey
在任何条纹操作的情况下,我们可以打印错误日志,它很容易理解。
print(error.debugDescription)