Uber无效的OAuth 2.0凭据在ios Swift中提供了Uber身份验证 [英] Uber Invalid OAuth 2.0 credentials provided Uber Authentication In ios Swift
问题描述
我正在iOS(Swift)中实施在STEP4中说明了使用承载令
将授权标头中响应中返回的access_token传递给Bearer类型以代表请求一个用户。*
curl -H'授权:Bearer YOUR_ACCESS_TOKEN''https://api.uber.com/v1 /products?latitude=37.7759792&longitude=-122.41823'
我不明白这一点。我应该如何在类型为Bearer的Header中传递access_token?我已经完成了如下操作
func callRequestAPI(url:String){
let request = appDelegate。 oauth.request(forURL:NSURL(string:url)!)
request.HTTPMethod =POST
let postString =product_id =+ selectedUberProductId +& start_latitude =+ start_lat +& start_longitude =+ start_lng +& end_latitude =+ end_lat +& end_longitude =+ end_lng
println( postString)
let tempData:NSData = appDelegate.oauth.accessToken.dataUsingEncoding(NSUTF8StringEncoding)!
let base64LoginString = tempData.base64EncodedStringWithOptions(nil)
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
request.addValue(application / json,forHTTPHeaderField:Content-键入)
request.addValue(application / json,forHTTPHeaderField:Accept)
request.setValue(Bearer \\ \\(base64LoginString),forHTTPHeaderField:Authorization)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request){data,response,错误在
如果错误!= nil {
println(error = \(error))
return
}
println(response = \(response))
let responseString = NSString(data:data,encoding:NSUTF8StringEncoding)
println(responseString = \(responseString) ))
}
task.resume()
}
但我得到以下回复
response =< NSHTTPURLResponse: 0x1a284b50> {URL:https://sandbox-api.uber.com/v1/requests} {status code:401,headers {
Content-Length= 75;
Content-Type=application / json;
Date =Mon,27 Apr 2015 10:22:01 GMT;
Server = nginx;
Strict-Transport-Security=max-age = 31536000; includeSubDomains; preload;
x-uber-app=uberex-sandbox;
x-xss-protection=1; mode = block;
}}
responseString =可选({message:提供的OAuth 2.0凭据无效。,代码:未授权})
最后我做到了:)
我改变了下面的方法和它工作
func callRequestAPI(url:String){
var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
var session = NSURLSession(配置:配置)
let params:[String:AnyObject] = [
product_id:selectedUberProductId,
start_latitude:start_lat,
start_longitude:start_lng,
end_latitude:end_lat,
end_longitude:end_lng]
let request = appDelegate.oauth.request(forURL:NSURL(string:url)!)
request.setValue(application / json; charset = utf-8,forHTTPHeaderField:Content-Type)
request.HTTPMethod =POST
var错误:NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params,options:NSJSONWritingOptions.allZeros,error:& err)
let task = session.dataTaskWithRequest(request){
data,响应,如果让httpResponse =响应为
中的错误? NSHTTPURLResponse {
if httpResponse.statusCode!= 202 {
println(response is not 202:\(response))
return
}
}
if(error!= nil){
println(错误提交请求:\(错误))
返回
}
//在这里处理成功响应的数据
var result = NSJSONSerialization.JSONObjectWithData(data,options:NSJSONReadingOptions.allZeros,error:nil)as! NSDictionary
println(result)
如果让request_id:String = result [request_id]为?字符串{
println(request_id)
}
如果让driver:String = result [driver]为?字符串{
println(driver)
}
如果让eta:Int = result [eta]为? Int {
println(eta)
}
如果让location:String = result [location]为?字符串{
println(location)
}
如果让status:String = result [status]为?字符串{
println(status)
}
如果let surge_multiplier:Int = result [surge_multiplier]为? Int {
println(surge_multiplier)
}
如果让vehicle:String = result [vehicle]为?字符串{
println(vehicle)
}
}
task.resume()
}
这里是我得到的回复,我的上述方法也给出了解析
{
driver =< null>;
eta = 15;
location =< null>;
request_id=ea39493d-b718-429f-8710-00a34dcdaa93;
status =处理;
surge_multiplier= 1;
vehicle =< null>;
}
享受
I'm implementing the Uber's Request Endpoint in my iOS (Swift) App. The Request API/Endpoint requires the user authentication with the app, here is the doc.
For this I'm using this Oauth2.0 library
What I did is
successfully integrated the Library in my project (xCode) with the help of given installation instructions.
In My AppDelegate
let uber_OAuth_Settings = [ "client_id": "XXXXXXX9vtKzobvXXXXXX", "client_secret": "EXXXXXXXXyFUNCa_Wez6AXXXXXXXnrXtxus", "authorize_uri": "https://login.uber.com/oauth/authorize", "token_uri": "https://login.uber.com/oauth/token", "redirect_uris": ["jamesappv2://oauth/callback"], // don't forget to register this scheme ] as OAuth2JSON
var oauth:OAuth2CodeGrant!
in my method
didFinishLaunchingWithOptions
of Appdelegateoauth = OAuth2CodeGrant(settings: uber_OAuth_Settings) oauth.viewTitle = "Uber Login Service" // optional oauth.verbose = true // For Logs
Don't forget to register url scheme i.e (
"redirect_uris": ["jamesappv2://oauth/callback"]
)
goto your app's Target -> info Tab -> Url Types -> Click (+), image attached
In AppDelegate add method given Below and Handle the Callback Url
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { // you should probably first check if this is your URL being opened var splitUrl = url.absoluteString!.componentsSeparatedByString(":") if splitUrl[0] == ("jamesappv2") { oauth.handleRedirectURL(url) } return true }
Now in my viewController I did like this on myBtnClick
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate let url = appDelegate.oauth.authorizeURL() UIApplication.sharedApplication().openURL(url) appDelegate.oauth.onAuthorize = { parameters in println("Did authorize with parameters: \(parameters)") self.navigationController?.pushViewController(self.PersonalDriverUber_VC, animated: true) //On Authorization Goto another ViewController using pushViewController of navigationcontroller Method } appDelegate.oauth.onFailure = { error in // `error` is nil on cancel if nil != error { println("Authorization went wrong: \(error!.localizedDescription)") } }
Here is my debug log, I'm getting the valid response:
OAuth2: Handling redirect URL jamesappv2://oauth/callback?state=4B0EB812&code=0sXXXXXXTX7yEbS1XXXXXHuw
OAuth2: Successfully validated redirect URL
OAuth2: Authorizing against https://login.uber.com/oauth/token?state=38158941&grant_type=authorization_code&code=0sXXXXXXXX1jxTrdFQT9Huw&client_secret=EIXXXXXXXNCa_Wez6XXXXXw0BlnrXtxus&client_id=fXXXXXXXy2LOUo9vtKXXXXXQ1nUDO&redirect_uri=jamesappv2%3A%2F%2Foauth%2Fcallback
OAuth2: Exchanging code 0swNXXXXX7yXXXXXXdFQT9Huw with redirect jamesappv2://oauth/callback for token at Optional("https://login.uber.com/oauth/token")
OAuth2: Did receive access token: Dfq3XXXXXXuWgpaqFXXXXXXXgXW, refresh token: EmStT7FEXHRMlS8odPzs1nsha0ObjK
Did authorize with parameters: [token_type: Bearer, expires_in: 2592000, access_token: XXXXXXOZuWgXXXXXXXXuJYOmgXW, refresh_token: EXXXXXHRMlS8oXXXXXXXa0ObjK, scope: profile, last_authenticated: 1430121470]
Notice I'm getting the valid access_token
Here I'm stuck
As per DOCs says in STEP4 *USE BEARER TOKEN
Pass the access_token returned in the response in the Authorization header with the type Bearer to make requests on behalf of a user.*
curl -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' 'https://api.uber.com/v1/products?latitude=37.7759792&longitude=-122.41823'
I am not getting the point. How should I pass the access_token in Header with type Bearer? I have done like below
func callRequestAPI(url:String){
let request = appDelegate.oauth.request(forURL: NSURL(string:url)!)
request.HTTPMethod = "POST"
let postString = "product_id="+selectedUberProductId+"&start_latitude="+start_lat+"&start_longitude="+start_lng+"&end_latitude="+end_lat+"&end_longitude="+end_lng
println(postString)
let tempData: NSData = appDelegate.oauth.accessToken.dataUsingEncoding(NSUTF8StringEncoding)!
let base64LoginString = tempData.base64EncodedStringWithOptions(nil)
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("Bearer \(base64LoginString)", forHTTPHeaderField: "Authorization")
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { data, response, error in
if error != nil {
println("error=\(error)")
return
}
println("response = \(response)")
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
println("responseString = \(responseString)")
}
task.resume()
}
but I'm getting following response
response = <NSHTTPURLResponse: 0x1a284b50> { URL: https://sandbox-api.uber.com/v1/requests } { status code: 401, headers {
"Content-Length" = 75;
"Content-Type" = "application/json";
Date = "Mon, 27 Apr 2015 10:22:01 GMT";
Server = nginx;
"Strict-Transport-Security" = "max-age=31536000; includeSubDomains; preload";
"x-uber-app" = "uberex-sandbox";
"x-xss-protection" = "1; mode=block";
} }
responseString = Optional({"message":"Invalid OAuth 2.0 credentials provided.","code":"unauthorized"})
Finally I have done it :)
I changed the method like below and it Worked
func callRequestAPI(url:String){
var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
var session = NSURLSession(configuration: configuration)
let params:[String: AnyObject] = [
"product_id" : selectedUberProductId,
"start_latitude" : start_lat,
"start_longitude" : start_lng,
"end_latitude" : end_lat,
"end_longitude" : end_lng]
let request = appDelegate.oauth.request(forURL: NSURL(string:url)!)
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.HTTPMethod = "POST"
var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.allZeros, error: &err)
let task = session.dataTaskWithRequest(request) {
data, response, error in
if let httpResponse = response as? NSHTTPURLResponse {
if httpResponse.statusCode != 202 {
println("response was not 202: \(response)")
return
}
}
if (error != nil) {
println("error submitting request: \(error)")
return
}
// handle the data of the successful response here
var result = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: nil) as! NSDictionary
println(result)
if let request_id: String = result["request_id"] as? String{
println(request_id)
}
if let driver: String = result["driver"] as? String{
println(driver)
}
if let eta: Int = result["eta"] as? Int{
println(eta)
}
if let location: String = result["location"] as? String{
println(location)
}
if let status: String = result["status"] as? String{
println(status)
}
if let surge_multiplier: Int = result["surge_multiplier"] as? Int{
println(surge_multiplier)
}
if let vehicle: String = result["vehicle"] as? String{
println(vehicle)
}
}
task.resume()
}
here is the Response I Got, Parsing is also given in my above method
{
driver = "<null>";
eta = 15;
location = "<null>";
"request_id" = "ea39493d-b718-429f-8710-00a34dcdaa93";
status = processing;
"surge_multiplier" = 1;
vehicle = "<null>";
}
Enjoy
这篇关于Uber无效的OAuth 2.0凭据在ios Swift中提供了Uber身份验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!