具有 Alamofire 下载功能的 JWT 身份验证

Posted

技术标签:

【中文标题】具有 Alamofire 下载功能的 JWT 身份验证【英文标题】:JWT Authentication with Alamofire download function 【发布时间】:2019-05-14 20:36:54 【问题描述】:

感谢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

【问题讨论】:

***.com/a/44910222/4311935 下载使用相同 @canister_exister 谢谢你的链接。这与 RequestAdapter 函数的行为相同。我从链接中实现了解决方案,不幸的是结果是一样的 【参考方案1】:

如果您的请求链中没有validation 步骤,则所有响应都将被视为成功。所以检查你的响应代码(或者在responseData之前添加.validate()),看看你的请求是否真的成功。此外,您可能需要仔细检查您的参数编码,尽管您似乎没有发送任何参数。

【讨论】:

我错过了验证步骤,现在可以了,谢谢。我不需要参数,身份验证是在标头中进行的,我不需要发送更多信息。虽然我不发送参数,但我应该指定参数编码吗?

以上是关于具有 Alamofire 下载功能的 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

将使用 Alamofire 下载的文件访问到具有未知文件名的下载目录

具有 [Authorize] 属性的 JWT 身份验证

具有 jwt 令牌和身份的 asp core 2 中基于角色的授权

具有相同令牌的多个 Laravel-API 的 JWT 身份验证

如果我使用 Ejabberd 身份验证和 JWT,我不需要注册用户吗?

具有无状态服务器且无服务器端呈现的 cookie 中的 JWT 身份验证