Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS Yelp OAuth Token Retrieval with URLRequest returning "client_id or client_secret parameters not found

I am attempting to retrieve an OAuth token to use Yelp's Fusion API from an iOS client using the native URL and URLRequest classes, but it is giving me this error in the "tokenInfo" variable:

client_id or client_secret parameters not found. Make sure to provide 
client_id and client_secret in the body with the 
application/x-www-form-urlencoded content-type

Here is my code:

func getToken(){
    var yelpTokenEndpoint = "https://api.yelp.com/oauth2/token"
    var tokenURL = URL(string: yelpTokenEndpoint)

    let requestJSON: [String:String] = ["client_id":"Not showing actual client id", "client_secret":"Not Gonna Show My Actual Client Secret either","grant_type":"client_credentials"]
    let requestData = try? JSONSerialization.data(withJSONObject: requestJSON)
    print(try? JSONSerialization.jsonObject(with: requestData!, options: []))
    var tokenURLRequest = URLRequest(url: tokenURL!)

    tokenURLRequest.httpMethod = "POST"
    tokenURLRequest.httpBody = requestData!
    tokenURLRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type")

    let tokenSession = URLSession.shared

    let tokenTask = tokenSession.dataTask(with: tokenURLRequest) { (data, response, error) in
        if error != nil {
            print("error getting your access token")
            print(error!.localizedDescription)
        }

        if let data = data{
            do{
                if let tokenInfo = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any]{
                    let token: String = tokenInfo["access_token"] as! String
                    print(token)
                }
            } catch {
                print("Error converting to JSON")
            }
        }
    }
    tokenTask.resume()
}

And yes, I am certain that I put the right client credentials in. Any help would be much appreciated, thanks!

like image 321
dhruvm Avatar asked Feb 25 '17 09:02

dhruvm


People also ask

What is client_id and client_secret?

the authorization code flow used in web apps that authenticate users server side. The client_id is used in the initial redirect, the client_secret is used in the last step where the app exchanges the one time code for a token. the client credentials flow used to authenticate applications rather than individual users.


1 Answers

Try this ....

let clientId = "client_id"
let clientSecret = "client_secret"
let tokenURL = "https://api.yelp.com/oauth2/token"
let grantType = "client_credentials"


let url = NSURL(string: tokenURL as String );

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

let request = NSMutableURLRequest(URL: NSURL(string: tokenURL)!)
request.HTTPMethod = "POST";
request.HTTPShouldHandleCookies = true
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")


let postString = "client_id=" + clientId + "&client_secret=" + clientSecret + "&grant_type=" + grantType
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

let task: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
    if let data = data {
        let response = NSString(data: data, encoding: NSUTF8StringEncoding)
        print(response)
    }
}
task.resume()
like image 57
htjohn Avatar answered Oct 20 '22 15:10

htjohn