2015-11-18 103 views
2

我想使用應用程序唯一身份驗證進行身份驗證,並且我成功獲取不記名令牌,但是當我嘗試調用REST API時,我總是收到401錯誤,這是我的代碼:Twitter只有應用程序驗證總是返回401

private var accessToken: String? 
private let consumerKey = "*********" 
private let consumerSecret = "*********" 
private let baseUrlString = "https://api.twitter.com/1.1/" 
private let pageSize = 20 

private func authenticate(completionBlock: Void ->()) { 

    if accessToken != nil { 
     completionBlock() 
    } 

    let credentials = "\(consumerKey):\(consumerSecret)" 
    let headers = ["Authorization": "Basic \(credentials.getBase64())"] 
    let params: [String : AnyObject] = ["grant_type": "client_credentials"] 

    Alamofire.request(.POST, "https://api.twitter.com/oauth2/token", headers: headers, parameters: params) 
     .responseJSON { response in 
      if let JSON = response.result.value { 
       self.accessToken = JSON.objectForKey("access_token") as? String 
       completionBlock() 
      } 
    } 
} 

func getTimelineForScreenName(screenName: String) { 

    authenticate { 

     guard let token = self.accessToken else { 
      // TODO: Show authentication error 
      return 
     } 

     let headers = ["Authorization": "Bearer \(token.getBase64())"] 
     let params: [String : AnyObject] = [ 
      "screen_name" : screenName, 
      "count": self.pageSize 
     ] 
     Alamofire.request(.GET, self.baseUrlString + "statuses/user_timeline.json", headers: headers, parameters: params) 
      .responseJSON { response in 
       print(response.response) 

       if let JSON = response.result.value { 
        print(JSON) 
       } 
     } 
    } 
} 

...

private extension String { 
    func getBase64() -> String { 
     let credentialData = self.dataUsingEncoding(NSUTF8StringEncoding)! 
     return credentialData.base64EncodedStringWithOptions([]) 
    } 
} 

我試圖創造新的密鑰,但什麼都沒有,也嘗試過什麼建議在iOS版9不讓Authorization頭髮現這個錯誤的導向,但這一請求獲得通過沒有使用任何重定向。

任何想法將不勝感激。

回答

7

經過幾個小時的調查後,我發現僥倖,不帶編碼器的標頭不應編碼爲base64,因此標頭應該看起來像這樣:
let headers = ["Authorization": "Bearer \(token)"]

我希望這可以幫助任何人嘗試類似的事情,因爲documentation說你必須使用base64編碼的令牌。

步驟3:驗證與所述承載令牌
承載的令牌可以被用於發出請求,以支持應用程序的唯一身份驗證API端點API請求。要使用不記名令牌,請構建一個正常的HTTPS請求幷包含一個授權標頭,其值爲承載者<base64 bearer token value from step 2>。簽名不是必需的。

+0

你能接受你的答案嗎? –

+0

@RhythmicFistman我試過了,但說明天后我可以接受。 –

+0

好的,沒問題。我喜歡看到案件結案。 –

相關問題