2015-05-06 102 views
0

我使用this库尤伯杯Authetication尤伯杯验证失败 “HTTP状态401:未经授权,响应:{” 错误 “: ”invalid_client“}”

https://developer.uber.com/v1/auth/

我曾经做过这样的

func doOAuthUber(){ 

let oauthswift = OAuth2Swift(
    consumerKey: "fXfXXXXXXXUo9vtKzobXXXXXUDO", 
    consumerSecret: "e5XXXXXXXq2w63qz9szEx7uXXXXXXo03W", 
    authorizeUrl: "https://login.uber.com/oauth/authorize", 
    accessTokenUrl: "https://login.uber.com/oauth/token", 
    responseType: "code" 
) 

var originalString = "jamesappv2://oauth/callback" 
var encodedCallBackUrl = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet()) 

println("encodedCallBackUrl: \(encodedCallBackUrl)") 


let state: String = "" 
oauthswift.authorizeWithCallbackURL(NSURL(string: encodedCallBackUrl!)!, scope: "request%20history", state: state, success: { 
    credential, response in 

    println(credential.oauth_token) 
    self.personalDriverLoader.stopAnimating() 



    }, failure: {(error:NSError!) -> Void in 

     self.personalDriverLoader.stopAnimating() 
     println(error.localizedDescription) 
}) 

} 

,但得到这个响应 HTTP状态401:未经授权,响应:{ “错误”: “invalid_client”}

我有三重检查,我的client_id(consumerKey)和秘密(consumerSecret)是正确的。 我已经在这里做了错事

更新:1

这是有线我改变的responseType:“代码”来的responseType:“令牌”和它的工作得到了我的访问令牌。但我得到的另一个问题现在

现在当过我尝试使用下面的代码来调用request endpoint api

@IBAction func btnRequestUberdidClicked(sender: AnyObject) { 

    self.callRequestAPI("https://sandbox-api.uber.com/v1/requests") 

} 

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] 



    appDelegate.oauthswift.client.post(url, parameters: params, 
    success: { data, response in 

    let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) 


     println("Success") 

        println(data) 

        println(response) 


     }, failure: {(error:NSError!) -> Void in 

         println("Error") 

        println(error) 
    }) 


} 

我得到这个响应

Error Domain=NSURLErrorDomain Code=401 "HTTP Status 401: Unauthorized, Response: {"message":"Invalid OAuth 2.0 credentials provided.","code":"unauthorized"}" UserInfo=0x1c563220 {NSLocalizedDescription=HTTP Status 401: Unauthorized, Response: {"message":"Invalid OAuth 2.0 credentials provided.","code":"unauthorized"}, Response-Headers=<CFBasicHash 0x1c578c40 [0x35305710]>{type = immutable dict, count = 7, 
entries => 
    1 : x-xss-protection = <CFString 0x1ae2fc60 [0x35305710]>{contents = "1; mode=block"} 
    4 : Server = <CFString 0x1acc24c0 [0x35305710]>{contents = "nginx"} 
    5 : Content-Type = <CFString 0x1c4d0020 [0x35305710]>{contents = "application/json"} 
    6 : Content-Length = <CFString 0x1c4b70b0 [0x35305710]>{contents = "75"} 
    8 : Date = <CFString 0x1c4ed4b0 [0x35305710]>{contents = "Wed, 06 May 2015 12:46:51 GMT"} 
    10 : Strict-Transport-Security = <CFString 0x1c225cb0 [0x35305710]>{contents = "max-age=31536000; includeSubDomains; preload"} 
    11 : x-uber-app = <CFString 0x1c49a6b0 [0x35305710]>{contents = "uberex-sandbox"} 
} 
} 
+0

尤伯杯API需要的OAuth2但您使用的LIB的您好!OAuth1的格式。检查https://github.com/dongri/OAuthSwift#examples。并且查看[Uber API文档](https://developer.uber.com/v1/auth/),auth以*三个步骤完成,而不是一个。 :) – Moritz

+0

@EricD。感谢您的回应。如何使用这个库来使用Oauth2。让我知道这有什么问题。你可以看到我已经使用OAuth2Swift –

+0

你正在使用正确的'OAuth2Swift'对象,*但*在其中使用了错误的声明格式。查看OAuthSwift页面上的* last *示例,其中不应该有任何'accessTokenUrl'。一旦你得到了这个回应,请遵循*重定向*,然后最终得到令牌。 :) – Moritz

回答

0

您将有在可能的情况下修改库并能够打印从优步返回的授权码。我在使用目标C进行优步认证时面临类似的问题,然后我从日志中意识到,优步将#_添加到授权码中。所以当这段代码被用来获取访问令牌时,它会失败,(401) unauthorised error只是说认证代码是无效的,实际上它是。

请参阅下图。

enter image description here

所以最终我不得不使用它来获得访问令牌之前移除了授权码的#_

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *params1 = @{@"client_secret":UBER_CLIENT_SECRET, 
          @"client_id":UBER_CLIENT_ID, 
          @"grant_type":@"authorization_code", 
          @"redirect_uri":UBER_REDIRECT_URL, 
          @"code":[app.uberAuthCodeStr stringByReplacingOccurrencesOfString:@"#_" withString:@""]}; 
        //******* THE FIX IS HERE ON THIS LINE ^^^ 

[manager POST:@"https://login.uber.com/oauth/v2/token" parameters:params1 success:^(AFHTTPRequestOperation *operation, id responseObject){ 
    NSLog(@"JSON: %@", responseObject); 
    // 
    app.uberBearerAccess_token = [responseObject valueForKey:@"access_token"]; 
    app.uberBearerRefresh_token = [responseObject valueForKey:@"refresh_token"]; 
    NSLog(@"Bearer AccessToken = %@ ",app.uberBearerAccess_token); 
    // Save access token to user defaults for later use. 
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; 
    NSNumber *seconds = [responseObject objectForKey:@"expires_in"]; 
    NSDate *expiryDate = [[NSDate date] dateByAddingTimeInterval:seconds.intValue]; 
    [defaults setObject:expiryDate forKey:KEY_UBER_TOKEN_EXPIRE_DATE]; 
    [defaults setObject:app.uberBearerAccess_token forKey: KEY_UBER_TOKEN]; 
    [defaults setObject:app.uberBearerRefresh_token forKey: KEY_UBER_REFRESH_TOKEN]; 
    [defaults setObject:app.uberAuthCodeStr forKey: KEY_UBER_AUTH_CODE]; 
    [defaults synchronize]; 
    loginView.hidden = YES; 
    [self goUberChat]; 
    // 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@':%@", error,params1); 
    [ProgressHUD dismiss]; 
}]; 

希望这可以帮助你或任何有类似问题的人。

-3

试试这个呼叫尤伯杯阿比

NSString *string=[NSString stringWithFormat:@"https://api.uber.com/v1/products"]; 
    NSURL *url=[NSURL URLWithString:string]; 
    AFHTTPSessionManager *manager=[[AFHTTPSessionManager alloc]initWithBaseURL:url]; 
    NSDictionary *parameters = @{@"server_token":@"Your token",@"latitude":@"latitude",@"longitude":@"longitude", 
    [manager GET: parameters:parameters progress:nil success:^(NSURLSessionTask *task,id responseObject){ 
    } failure:^(NSURLSessionTask *operation , NSError *error) 
}]; 
+0

尽管此代码可能会回答这个问题,但提供关于为什么和/或如何回答问题的其他内容将显着提高其长期价值。请[编辑]你的答案,添加一些解释。 – CodeMouse92

相关问题