经过身份验证的 http 请求 swift Alamofire

Posted

技术标签:

【中文标题】经过身份验证的 http 请求 swift Alamofire【英文标题】:Authenticated http request swift Alamofire 【发布时间】:2015-07-08 09:48:42 【问题描述】:

我正在努力让它工作以向我的 API 发出请求。没有令牌可以工作,但是当我尝试添加额外的标头时,对我来说事情变得很复杂。

首先,结构。 一个名为:APIAsyncTask 的类发出请求

一个名为 APIParams 的类,只是一个将参数发送到 APIAsyncTask 类的数据持有者。

一个名为 DatabaseAPI 的类生成参数,并将其发送到 APIAsyncTask 类。

数据库API

func someMethod()

    let task = APIAsyncTasks()
    task.registerCallback  (error, result) -> Void in
        print("Finished task, back at DatabaseAPI")
    
    let params2 = APIParams(request: .GET, apiPath: "Posts/1", apiToken: "4iTX-56w")
    task.APIrequest(params2)

APIAsyncTask

这部分是为了修复另一个错误,因为经理不是全局的,任务很快被取消了。

var manager : Manager!

init(authenticatedRequest : Bool, token: String?)

    manager = Alamofire.Manager()
    print("Pre \(manager.session.configuration.HTTPAdditionalHeaders?.count)")
    if(authenticatedRequest && token != nil)
    
        var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders!   
        defaultHeaders["Authorization"] = "bearer \(token)"
        let configuration = Manager.sharedInstance.session.configuration
        configuration.HTTPAdditionalHeaders = defaultHeaders

        manager = Alamofire.Manager(configuration: configuration)
    
    print("Post \(manager.session.configuration.HTTPAdditionalHeaders?.count)")

经过一些决策,归结为这部分。

 private func GetRequest(url: String!,token : String?, completionHandler: (JSON?, NSURLRequest?, NSHTTPURLResponse?, NSError?) -> () ) -> ()

    print("Begin Get Request")

    if(token != nil)//if token is not nil, make authenticated request
    
        print("just before request: \(manager.session.configuration.HTTPAdditionalHeaders?.count)")
        manager.request(.GET, url, parameters: nil, encoding: .JSON).responseJSON  (request, response, json, error) in
            print("Get Request (authenticated), inside alamofire request")
            var resultJson : JSON?
            if(json != nil)
            
                resultJson = JSON(json!)
            
            completionHandler(resultJson, request, response, error)
        
    
    else
    
     //working part without token

所以现在的代码,我在完成时收到错误:

马特本人gives the answer 使用Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ,所以应该没问题...

根据this 博客,我怀疑这与多线程有关。或者,因为它是关于 CFNetwork 的,可能是因为我的 API 不使用 SSL?我禁用了 NSAppTransportSecurity

我对 swift 有点陌生,因此非常感谢您提供示例!谢谢!

【问题讨论】:

你应该对经理保持强烈的参考。我不确定,但你能检查一下吗? 建议的操作?我不确定如何使它成为弱参考.. 【参考方案1】:

因此,您的大部分代码看起来都很可靠。

这个错误让我相信 CFNetwork 很难弄清楚如何计算挑战的保护空间。我还假设您正在接受基本的身份验证挑战,因为您附加了 Authorization 标头。

考虑到这一点,进一步挖掘您的逻辑使我看到您没有将token 正确附加到Authorization 标头内的字符串。您需要改为执行以下操作。

defaultHeaders["Authorization"] = "bearer \(token!)"

否则您的Authorization 标头值将包含Optional(value) 而不仅仅是value

这是我目前能看到的唯一问题。如果您可以尝试一下并发表评论,那就太好了。如果这并不能真正解决您的问题,我会相应地更新我的答案。

祝你好运!

【讨论】:

嗨 cnoon,感谢您抽出宝贵时间尝试找出问题所在。另外,感谢您告诉我我的代码看起来很可靠。我确实得到了一个身份验证挑战。与此同时,我花时间登录,从而获得了一个真正的访问令牌。所以我只是用你的答案,用一个真正有效的访问令牌试了一下,它工作!那个..小!成功了..但是:我正在检查这是否只是运气,因为它现在是一个有效的访问令牌,结果证明,如果它无效或过期,它仍然会抛出相同的错误:( 所以,长话短说,! 是必需的,但是当访问令牌无效或过期时,我会得到相同的异常,而不是 401 http 代码。【参考方案2】:

您可以使用Alamofire 2Swift 2 在请求中添加标头。

例如:go to example

【讨论】:

你测试过token无效时是否抛出异常吗?还是返回 401? 我处理了服务器端的错误。我的标题“授权”即将为空。现在它正在工作。 我的意思是:当您在标头中设置的令牌无效或过期时,它会崩溃/抛出异常还是返回 401? 不,什么都没发生,这就是为什么我很难找到发生了什么。

以上是关于经过身份验证的 http 请求 swift Alamofire的主要内容,如果未能解决你的问题,请参考以下文章

Firestore REST API 使用 http-client 发出经过身份验证的请求

ioS Swift新用户无法登录,直到应用程序终止并启动

Angular 6:发送经过身份验证的请求

如何在 Swift 中制作经过身份验证的 HTTPS 帖子?

使用浏览器中现有的经过身份验证的会话在python上执行https请求

cloudKit:CKSubscription 错误“此请求需要经过身份验证的帐户””