我应该如何在swift中获得OAuth2.0访问令牌?

时间:2016-08-18 15:55:19

标签: ios swift oauth-2.0

我正在尝试制作一个Unsplash照片客户端,这需要我使用网站的API。根据文档,为了能够访问照片相关信息(如pageURls,imagesURL等),需要oAuth2.0。它声明我必须做以下事情:

  1. 使用一些查询参数将用户定向到https://unsplash.com/oauth/authorize
  2. 如果用户接受请求,则用户将被重定向到redirect_ui(其中一个参数),并在代码查询参数中使用授权码
  3. 使用某些参数向https://unsplash.com/oauth/token发出POST请求。
  4. 这就是我尝试在代码中实现它的方法:

    ViewController.swift

     class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        authenticator()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    
    func authenticator(){
    
        Alamofire.request(.GET, "https://unsplash.com/oauth/authorize", parameters: [
        "client_id": "2902affb00634248f77b3c5c7a4ba4232fa36e3cbaad826b223a27f3df57e642"
        , "redirect_uri": "Sample//:" ,
          "response_type" : "code" ,
          "scope":"" ]).responseJSON{ response in
    print("original URL request : \(response.request) ")
    print("URL response : \(response.response) ")
        }
    
    
        Alamofire.request(.POST, "https://unsplash.com/oauth/authorize", parameters: [
            "client_id"    : "2902affb00634248f77b3c5c7a4ba4232fa36e3cbaad826b223a27f3df57e642",
            "client_secret":"6e85c0e5bcda025f0553e1343dcbdd8a892b0db1cc3a653055d84ce44c217bb9",
            "redirect_uri" : "Sample//:" ,
            "code" : "c15781809f4ee781e6019b958a2702be0dab61e89df96863693dbd7d48bacd53" ,
            "grant_type":"authorization_code" ])
            .responseJSON { response in
                print(response.request)  // original URL request
                print(response.response) // URL response
                print(response.data)     // server data
                print(response.result)   // result of response serialization
    
                if let JSON = response.result.value {
                    print("JSON: \(JSON)")
            }
        }
    }
    

    但这就是我得到的:

      Optional(<NSMutableURLRequest: 0x7f9cf959f700> { URL:        https://unsplash.com/oauth/authorize })
      Optional(<NSHTTPURLResponse: 0x7f9cf941f920> { URL: https://unsplash.com/oauth/authorize } { status code: 422, headers {
    "Accept-Ranges" = bytes;
    Connection = "keep-alive";
    "Content-Length" = 8440;
    "Content-Type" = "text/html; charset=utf-8";
    Date = "Thu, 18 Aug 2016 15:24:30 GMT";
    Server = Cowboy;
    "Strict-Transport-Security" = "max-age=31536000";
    Via = "1.1 vegur, 1.1 varnish";
    "X-Cache" = MISS;
    "X-Cache-Hits" = 0;
    "X-Ratelimit-Limit" = 100;
    "X-Ratelimit-Remaining" = 94;
    "X-Request-Id" = "f00ae2f9-6369-4526-9b28-283c294e2a30";
    "X-Runtime" = "0.012134";
    "X-Served-By" = "cache-sin6920-SIN";
    "X-Timer" = "S1471533870.429494,VS0,VE550";
     } })
       Optional(<3c21444f 43545950 45206874 6d6c3e0a 3c68746d 6c3e0a3c 68656164 3e0a2020 ....2e 636f6d2f 616e616c 79746963 732e6a73 272c2767 6127293b 0a0a2020 20206761 28276372 65617465 272c2027 55412d33 36303439 3637302d 34272c20 27617574 6f27293b 0a202020 20676128 2773656e 64272c20 27706167 65766965 7727293b 0a202020 20676128 2773656e 64272c20 27657665 6e74272c 20276163 74696f6e 272c2027 34323227 293b0a20 203c2f73 63726970 743e0a0a 3c2f626f 64793e0a 3c2f6874 6d6c3e0a>)
       FAILURE
    

    我该如何解决此错误?

1 个答案:

答案 0 :(得分:3)

Did you figure this out ? If not I will give you a hint. Follow my step you will get success with Access-Token return from Unsplash.

First, we will find-out how to use this request https://unsplash.com/oauth/authorize. With this request you need use UIWebView because this will return you a HTML page.

Try this https://unsplash.com/oauth/authorize?client_id=Your_App_ID&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=public+read_user+write_user+read_photos+write_photos+write_likes+read_collections+write_collections with UIWebView.

After this request by using UIWebView you will get a code returned like this https://unsplash.com/oauth/authorize/f2ad36deb30b37a2614898e366b84e7c0f68fccd0358565cfbdc2637e*****

The code after /authorize/ is the code you need to fill your code parameter with request https://unsplash.com/oauth/token - Now you can use Alamofire to get your Token.

Just give questions if you still having problems