ios - 具有 Alamofire 下载功能的 JWT 身份验证
问题描述
感谢Alamofire,我正在尝试下载一个 zip 文件并使用 JWT 令牌身份验证从服务器保存它。无需令牌身份验证即可正常下载,文件已成功保存。当我激活服务器端身份验证(使用带有 NodeJS 的 Passport.js)时,我总是收到 401。我使用 sessionManager 适配器函数将令牌附加到标头。其他请求(发布,使用 sessionManager.request(..) 获取)适用于这种身份验证机制。
问题是:我们可以修改Alamofire下载功能的标题吗?如果是怎么办?
任何建议表示赞赏
func getZip(){
let sessionManager = Alamofire.SessionManager.default
let authHandler = JWTAccessTokenAdapter(accessToken: Auth.getAccessToken())
sessionManager.retrier = authHandler
sessionManager.adapter = authHandler
let downloadUrl: String = Auth.getApiEndpoint() + "get_zip"
let destinationPath: DownloadRequest.DownloadFileDestination = { _, _ in
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0];
let fileURL = documentsURL.appendingPathComponent("myZip.zip")
return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
sessionManager.download(downloadUrl, method: .get, encoding: URLEncoding.httpBody, to: destinationPath)
.downloadProgress { progress in
print(">> Zip Download Progress: \(progress.fractionCompleted)")
}
.responseData { response in
switch response.result{
case .success:
if response.destinationURL != nil, let filePath = response.destinationURL?.absoluteString {
print("success & filepath : \(filePath)")
completionHandler(filePath, true)
}
break
case .failure:
print("faillure")
completionHandler("", false)
break
}
}
}
}
JWT 适配器:
class JWTAccessTokenAdapter: RequestAdapter {
typealias JWT = String
private var accessToken: JWT
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var urlRequest = urlRequest
if let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix(Auth.getApiEndpoint()) {
/// Set the Authorization header value using the access token.
urlRequest.setValue(accessToken, forHTTPHeaderField: "Authorization")
}
return urlRequest
}
}
输出 :
response: SUCCESS: 12 bytes // (Unauthorized) -> Corrupted zip file
解决方案
如果您的请求链中没有validation
步骤,则所有响应都将被视为成功。因此,请检查您的响应代码(或仅添加.validate()
before responseData
),看看您的请求是否真的成功。此外,您可能需要仔细检查您的参数编码,尽管您似乎没有发送任何参数。
推荐阅读
- ruby-on-rails - Ruby on Rails 中的连接池
- javascript - Mongoose:usr.findOneAndUpdate 不是一个函数
- javascript - Axios 在 post 请求中发送数组
- r - 如何将列从英尺和英寸 (X'X) 转换为米?
- php - PHPExcel在存储Excel文件后释放内存
- php - 无法重定向到 php 中新创建的页面
- python - 如何将单词转换为浮点值
- javascript - Sails.js 控制器从 Promise 中获取数据
- firebase - 当 Firestore 字段更新时,Observables 会重新查询所有数据吗?
- ssl - 从 Flutter App 进行 API 调用时如何处理证书文件?