2016-02-12 70 views
1

我正在使用新的Lyft API,它在認證部分中說它發送訪問令牌請求並顯示示例響應, 「ACCESS_TOKEN」。訪問來自NSURLSession(Lyft API)的JSON響應中的鍵值的問題

樣本響應

HTTP/1.1 200 OK 
Content-Type: application/json;charset=UTF-8 
Cache-Control: no-store 
Pragma: no-cache 
{ 
"access_token": <access_token>, 
"token_type":"bearer", 
"expires_in":3600, 
"scope": "public" 
} 

然而,當我撥打電話(是的客戶端ID和祕密是正確的,但我不能張貼在這裏),它返回一個響應,但訪問令牌是零。

感謝您一如既往的幫助!文件鏈接下面,

API文檔,

https://developer.lyft.com/docs/authentication

func authorize() { 

    let authString = NSString(format: "%@:@%", clientID, clientSecret) 
    let authData = authString.dataUsingEncoding(NSUTF8StringEncoding) 

    let base64String = authData!.base64EncodedDataWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 

    let url = NSURL(string: "https://api.lyft.com/oauth/token") 
    let request = NSMutableURLRequest(URL: url!) 

    request.HTTPMethod = "GET" 
    request.setValue("Basic \(base64String)", forHTTPHeaderField: "Authorization") 

    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) 

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 

     let dictionary = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) 


     if let accessToken : String = dictionary["access_token"] as? String { 

      print(accessToken) 
     } 
    } 

    task.resume() 

} 
+0

如果你打電話'base64EncodedStringWithOptions',而不是'base64EncodedDataWithOptions'會發生什麼? – bringel

+0

確實發生了同樣的事情......雖然我從與Lyft的支持人員交談中發現它應該是一個「POST」而不是「GET」,雖然即使那樣我也沒有得到正確的答案。 – Echizzle

+0

@Echizzle:我正在做同樣的整合,你有什麼更新。 –

回答

0

基於關閉Lyft文檔,我覺得想爲您的身份驗證字符串格式是錯誤的。

,我認爲你應該做

let authString = NSString(format: "%@:@%", clientID, clientSecret),不

let authString = NSString(format: "%@, @%", clientID, clientSecret)

+0

是的,有人發佈之前,但刪除了他們的評論,我更新它,我仍然收到400錯誤,雖然意味着收到請求,但沒有身份驗證令牌。 – Echizzle

+0

你遇到400錯誤?基於文檔頁面的底部,您缺少一個grant_type參數。它看起來應該作爲請求的主體來傳遞。 'NSURLRequest'有'NSData'類型的'HTTPBody'屬性 – bringel

+0

我剛剛注意到,我包含它,但仍然不工作... **讓bodyDict:[String:AnyObject] = [「grant_type」:[ 「client_credentials」,「authorization_code」,「refresh_token」],「scope」:「public」] let dataExample:NSData = NSKeyedArchiver.archivedDataWithRootObject(bodyDict) request.HTTPBody = dataExample ** – Echizzle