Ошибка аутентификации Uber. Статус HTTP 401: Неавторизовано. Ответ: {ошибка: invalid_client}

я использую эту библиотеку для аутентификации Uber

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: «code» на responseType: «token», и это сработало. Got My access token. но теперь у меня другая проблема

теперь, когда я пытаюсь вызвать 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"}
}
}

person Qadir Hussain    schedule 06.05.2015    source источник
comment
Uber API требуется OAuth2, но вы используете формат OAuth1 вашей библиотеки. Проверьте github.com/dongri/OAuthSwift#examples . И посмотрите в документ Uber API, авторизация выполняется в трех шагов, а не одного. :)   -  person Eric Aya    schedule 06.05.2015
comment
@ЭрикД. спасибо за ответ. как использовать Oauth2 с помощью этой библиотеки. дайте мне знать, что не так с этим. вы можете видеть, что я использовал OAuth2Swift   -  person Qadir Hussain    schedule 06.05.2015
comment
Вы используете правильный объект OAuth2Swift, но в нем вы используете неправильный формат объявления. Посмотрите на последний пример на странице OAuthSwift, в нем не должно быть accessTokenUrl. После того, как вы получите этот ответ, выполните перенаправление, а затем, в конце концов, получите токен. :)   -  person Eric Aya    schedule 06.05.2015
comment
это связано. Я изменил responseType: code на responseType: token, и это сработало (o0). Получил мой токен доступа. но теперь у меня другая проблема   -  person Qadir Hussain    schedule 06.05.2015
comment
@ЭрикД. посмотри мое обновление   -  person Qadir Hussain    schedule 06.05.2015
comment
У меня больше нет учетной записи Uber, поэтому я не могу больше тестировать или помогать с вашим примером. Во всяком случае, при поиске информации я нашел ваш предыдущий вопрос, где вы, похоже, нашли способ добиться этого!!! Я немного озадачен сейчас. :п   -  person Eric Aya    schedule 06.05.2015
comment
Это неправильно, наверняка требуется URL-адрес токена доступа. Если он не включен, произойдет сбой, потому что он попытается использовать его для получения токена позже в OAuthSwiftHTTPRequest.   -  person Nathan McKaskle    schedule 23.08.2015
comment
У меня тоже такая же проблема. На данный момент это необъяснимо. Я думал, что исправил это один раз, когда у меня не было политики конфиденциальности и я неправильно выбрал область действия на их странице, но теперь проблема вернулась и не имеет никакого смысла.   -  person Nathan McKaskle    schedule 23.08.2015


Ответы (2)


Вам нужно будет изменить библиотеку, где это возможно, и иметь возможность распечатать код авторизации, возвращенный от Uber. Я столкнулся с аналогичной проблемой с аутентификацией Uber с использованием цели C, а затем я понял из своих журналов, что Uber добавлял #_ к коду авторизации. Поэтому, когда этот код использовался для получения токена доступа, он терпел неудачу с (401) unauthorised error, просто говоря, что код аутентификации недействителен, и это действительно так.

См. прикрепленное изображение ниже.

введите здесь описание изображения

Поэтому в конце концов мне пришлось удалить #_ из кода авторизации, прежде чем использовать его для получения токена доступа.

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];
}];

Надеюсь, это поможет вам или кому-либо с похожей проблемой.

person nmvictor    schedule 29.03.2016

Попробуйте это для вызова Uber Api

 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)
}];
person DURGESH    schedule 03.05.2016
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, почему и/или как он отвечает на вопрос, значительно улучшит его долгосрочную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить некоторые пояснения. - person CodeMouse92; 03.05.2016