Swift应用GCS下载URL失效(401 App Check令牌无效)排查
Firebase Storage下载URL偶尔出现401(App Check令牌无效)的原因
我在Swift应用中将文件上传至Google Cloud Storage(GCS)的非公开存储桶,上传完成后获取downloadURL并保存。多数文件的下载URL可正常使用,但有部分URL会莫名失效。使用Safari尝试下载这类失效URL时,会返回如下错误:
{ "error": { "code": 401, "message": "Firebase App Check token is invalid." } }
我的应用已启用Firebase App Check,明确是令牌无效导致,但不清楚具体原因。以下是最初用于上传文件的函数:
public func putFile(teamFolderName: String, url: URL, filename: String, metadata: StorageMetadata?, completion: @escaping (URL?, Error?)->(Void)) -> StorageUploadTask { Console.sharedInstance.log.info("Uploading file \(filename) to team folder: \(teamFolderName)") let fileRef = getTeamStorageReference(for: teamFolderName).child("\(filename)") let uploadTask = fileRef.putFile(from: url, metadata: metadata, completion: { (metadata, error) in guard let _ = metadata else { completion(nil,error) return } fileRef.downloadURL { (url, error) in completion(url,error) return } }) return uploadTask }
我目前用HEAD请求校验URL可达性作为临时解决方案:如果URL不可达则重新上传并获取新的downloadURL,这个方案可行,但仍不清楚部分URL失效的原因。以下是更新后的代码:
public func putFile(teamFolderName: String, url: URL, filename: String, metadata: StorageMetadata?, completion: @escaping (URL?, Error?)->(Void)) -> StorageUploadTask { Console.sharedInstance.log.info("Uploading file \(filename) to team folder: \(teamFolderName)") let fileRef = getTeamStorageReference(for: teamFolderName).child("\(filename)") let uploadTask = fileRef.putFile(from: url, metadata: metadata, completion: { (metadata, error) in guard let _ = metadata else { Async.main { completion(nil, error) } return } fileRef.downloadURL { (url, error) in guard let downloadURL = url else { Async.main { completion(nil, error) } return } // Check if the download URL is reachable var request = URLRequest(url:downloadURL) request.httpMethod = "HEAD" let task = URLSession.shared.dataTask(with: request) { (data, response, error) in guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { let statusCode = (response as? HTTPURLResponse)?.statusCode ?? -1 let errorDescription = (response as? HTTPURLResponse).debugDescription var errorMsg = "Download URL not reachable. httpResponse.statusCode: (\(statusCode)). -> URL(\(request.url?.absoluteString ?? "missing url"))" errorMsg += " -> Response: \(errorDescription)" Console.sharedInstance.log.error(errorMsg) Tracker.sharedInstance.trackEvent(withName: "ERROR", eventParameters: ["error": errorMsg]) Async.main { completion(nil, error ?? NSError(domain: "com.xxx.app", code: statusCode, userInfo: [NSLocalizedDescriptionKey: errorMsg])) } return } Async.main { completion(downloadURL, nil) } } task.resume() } }) return uploadTask }
请问导致部分downloadURL失效的原因是什么?
内容的提问来源于stack exchange,提问作者thierryb
相关产品推荐
相关产品推荐

