2017-07-02 37 views
0

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

我可以通过登录获取身份验证令牌。但我可以通过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中有问题。但我找不到它。

你能帮我吗?

此致敬礼。

回答

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) 
     } 

    } 

使用此功能,您可以在请求中发送标题以获取所需内容。

+0

你能否看到我我的答案是在下面。 –

+0

它是完美的经营谢谢你。我不得不改变那个“方法:.post到方法:.get” –

+0

@박형렬乐意帮忙,把答案设为有效! – Edu

0

我觉得这个部分有头部授权。 这是错的吗?

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

没关系,但是Alamofire给了你在请求中设置它的机会,所以不需要创建一个MutableUrlRequest。这就是为什么我把它放在我的答案中 – Edu