如何通过alamofire4和swift3为登录api提供身份验证令牌

时间:2017-07-02 15:06:19

标签: ios swift authorization token alamofire

所有

我可以通过登录获取身份验证令牌。但我可以通过swift和alamofire在我的服务器上进行身份验证。

这是邮递员。如你所见,如果我有令牌,我可以在myserver上进行身份验证。 enter image description here

这是快速的viewcontroller。

import UIKit
import Alamofire
import SwiftyJSON
import KeychainAccess

class ViewController: UIViewController {
    let authLoginUrl = "http://ec2-52-79-155-29.ap-northeast-2.compute.amazonaws.com:8000/rest-auth/login/"
    let keychain = Keychain(service: "wanote")
    let projectUrl = "http://ec2-52-79-155-29.ap-northeast-2.compute.amazonaws.com:8000/api/user/ryulstory"

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let username = "username"
        let password = "1234!"

        self.doAuth(username: username, password: password)
        }

        override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func doAuth(username:String, password:String) {
        let params = ["username": username, "password": password]
        var authToken = Alamofire.request(self.authLoginUrl, method: .post, parameters: params)
        authToken.responseJSON { response in
            let statusCode = response.response?.statusCode ?? 0

            switch statusCode {
            case 200...299:
                let jsonData = JSON(response.result.value)
                if let token = jsonData["key"].string{
                    self.keychain["token"] = token
                    self.getProjects()
                }
            case 400...499:
                print("Server responded no")

            case 500...599:
                print("Server error")

            default:
                print("There was an error with your request")
            }

    }
}

    func getProjects(){
        if let token = self.keychain["token"] {
            if let Purl = URL(string: self.projectUrl){
                var mutableUrlRequest = URLRequest(url: Purl)
                mutableUrlRequest.httpMethod = "GET"
                mutableUrlRequest.setValue("Token " + token, forHTTPHeaderField: "Authorization")
                var manager = Alamofire.SessionManager.default
                var getProjectsRequest = manager.request(mutableUrlRequest)
                    getProjectsRequest.responseJSON { response in
                        print(response.data)
                }

            }

        } else {
            print("no token")
        }


    }


}

我检查了通过函数doAuth获取令牌。它正确运作。 函数getprojects生成错误状态码401。 我认为函数getprojects存在问题。但我找不到它。

你可以帮助我吗?

最好的问候。

2 个答案:

答案 0 :(得分:1)

它转到401,因为您在没有标题授权的情况下发送请求。

使用Alamofire,您可以像这样设置标题授权。

    let url = "URL_LOGIN"
    //Get token logic
    let token = ""
    let headers = ["Authorization": "Token \(token)"]
    let params = ["user": "", "pass":""] //This goes in the body of the request
    Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.default, headers: headers).responseJSON { (response) in
        if let value = response.result.value {
            print(value)
        }

    }

通过此功能,您可以在请求中发送标题以获得所需内容。

答案 1 :(得分:0)

我认为这部分有头部授权。 这不对吗?

mutableUrlRequest.httpMethod = "GET"
                mutableUrlRequest.setValue("Token " + token, forHTTPHeaderField: "Authorization")
                var manager = Alamofire.SessionManager.default
                var getProjectsRequest = manager.request(mutableUrlRequest)