集中管理身份验证的方式

时间:2019-07-26 12:21:26

标签: ios swift alamofire

我正在使用Alamofire的应用程序中实现授权。我有一个授权令牌,可以添加到我提出的每个HTTP请求的标头中,然后检查其响应以查看服务器是否返回了401状态码?然后,注销用户。

最佳做法是什么?有没有一种简单的方法可以将此行为添加到每个请求中?

我期望的目标是在我的代码中检查401 error code的真相。

我没有找到令人满意的答案,有关如何执行此操作的任何建议?

3 个答案:

答案 0 :(得分:1)

Alamofire提供了两个protocolRequestAdapter

每次大约发出请求时,都会通知

RequestRetrier。这是注入令牌的理想场所。

每次由于任何原因而导致请求失败时,都会通知

RequestAdapter。您可以检查故障原因并检测到401未经授权的情况,然后向系统发送全局通知(可能在RequestRetrier中进行管理)

您必须将它们分配给当前的AppDelegate管理请求。

您还可以阅读how to implement simple OAuth的Alamofire文档。

答案 1 :(得分:0)

您发送请求的主要方法如下

func sendJsonRequest(
    accessPoint: String,
    method: HTTPMethod,
    parameters: Parameters,
    headers: HTTPHeaders,
    encoding: ParameterEncoding = JSONEncoding.default,
    success: @escaping (_ response: DataResponse<Any>, _ json: NSDictionary) -> Void,
    failure: @escaping (_ response: DataResponse<Any>, _ error: Error) -> Void
) -> DataRequest {
    return Alamofire.request(
            accessPoint,
            method: method,
            parameters: parameters,
            encoding: encoding,
            headers: headers
    ).validate().responseJSON(queue: getQueue()) { response in
        switch response.result {
        case .success (let data):
            success(response, data)
        case .failure(let error):

            if response.response?.statusCode == 401 {
                // Do what you want to do here
            } else {
                failure(response, error)
            }
        }
    }
}

以及其他诸如get,post之类的方法都可以在内部调用它

func post(
    accessPoint: String,
    parameters: Parameters,
    headers: HTTPHeaders,
    success: @escaping (_ response: DataResponse<Any>, _ json: NSDictionary) -> Void,
    failure: @escaping (_ response: DataResponse<Any>, _ error: Error) -> Void
) -> DataRequest {
    return sendJsonRequest(
            accessPoint: accessPoint,
            method: .post,
            parameters: parameters,
            headers: headers,
            success: success,
            failure: failure
    )
}


func get(
    accessPoint: String,
    headers: HTTPHeaders,
    success: @escaping (_ response: DataResponse<Any>, _ json: NSDictionary) -> Void,
    failure: @escaping (_ response: DataResponse<Any>, _ error: Error) -> Void
) -> DataRequest {
    return jsonRequest(
            accessPoint: accessPoint,
            method: .get,
            parameters: [:],
            headers: headers,
            encoding: URLEncoding.default,
            success: success,
            failure: failure
    )
}

这可以在您的BaseService中,其他服务可以扩展它。

答案 2 :(得分:0)

我想您想问的是如何验证用户的cookie是否可用。 我这样处理:

  1. 使用 HTTPCookieStorage 存储用户的cookie(包含令牌,过期时间,值和其他)
    IN登录

        Alamofire.request(url, method: .post, parameters: para, encoding: URLEncoding.default,headers: headers).response { (response) in
        guard response.response?.statusCode == 200 else{
            // error handling
            return
        }
        let headerFields = response.response?.allHeaderFields as? [String: String]
        let Url = response.request?.url
        let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields!, for: Url!)
        HTTPCookieStorage.shared.setCookies(cookies, for: Url!, mainDocumentURL:nil)
    }
    
  2. HTTPCookieStorage将自动删除过期的Cookie, 我的应用程序,最多只能有一个Cookie,所以我使用

        if HTTPCookieStorage.shared.cookies == [] {
        //error
        }
    

检查令牌是否无效,或者您可以使用 NSHTTPCookieManagerCookiesChanged 通知来观察cookie的更改。

  1. 之后使用alamofire时,alamofire会将此令牌设置为HTTP请求标头。