iPhone Objective C oauth 2.0 Login - unsupported_grant_type

Я новичок в разработке Salesforce и пытаюсь подключиться к Salesforce, чтобы получить токен.

Я предполагаю, что мой вопрос состоит из двух частей: 1) Должен ли я использовать веб-страницу для аутентификации в SF?

2) Если нет, то почему это не работает? Когда я пытаюсь использовать метод аутентификации с использованием имени пользователя и пароля, я получаю: {"error": "unsupported_grant_type", "error_description": "grant type not supported"}

Вот мой код:

NSString *post = [NSString stringWithFormat:@"grant_type=basic-credentials&client_id=%@&client_secret=%@&redirect_uri=%@",
                  kOAuthClientID,
                  kOAuthClientSecret,
                  kOAuthClientAuthURL
                  ];


NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:kOAuthClientTokenUrl]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSError *error;
NSURLResponse *response;
NSLog(@"%@", request);
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
NSLog(@"%@", data);

Любые мысли приветствуются.

Я попытался использовать grant_type = authorization_code, но получил еще одну ошибку:

{"error": "invalid_grant", "error_description": "неверный код авторизации"}


person smcdrc    schedule 11.02.2011    source источник
comment
привет, можете ли вы сказать, что означает kOAuthClientAuthURL и kOAuthClientTokenUrl и как вы наконец смогли заставить его работать, потому что ответ от superfell, похоже, тоже не работает.   -  person sole007    schedule 27.07.2011


Ответы (3)


Если вы хотите использовать тип предоставления имени пользователя / пароля, тогда его тип - пароль, а не базовые учетные данные, правильный набор параметров для отправки:

grant_type=password
client_id=xxxxxxxxxx
client_secret=1234567890
[email protected]
password=XXXXXXXXX

Как я уже упоминал в вашем предыдущем вопросе, хотя это работает, вы действительно хотите использовать веб-поток, чтобы поддерживать клиентов Salesforce, которые используют альтернативные службы входа в систему, такие как SAML.

person superfell    schedule 11.02.2011
comment
когда я использовал вышеупомянутые параметры, я получил ошибку unsupported_response_type, я ее предоставил. Затем я получил сообщение об отсутствии перенаправленного uri, затем я предоставил URI успеха OAuth2 для salesforce. Тем не менее, я получаю странный ответ, который не является ни идентификатором сеанса, ни токеном, требуется небольшая помощь :( - person sole007; 27.07.2011
comment
По какому URL-адресу вы его отправляете, и вам также необходимо, чтобы URL-адрес закодировал все параметры, чего вы, похоже, не делаете. - person superfell; 27.07.2011
comment
я отправляю успешный URL-адрес Salesforce, то есть login.salesforce.com/services/oauth2/success. И я кодирую все в формальном URL-адресе. некоторая помощь, пожалуйста - person sole007; 28.07.2011

1) Да, вы это делаете, с помощью OAuth вам необходимо войти в Salesforce и предоставить доступ вашему приложению. Для приложения iOS вы должны просмотреть поток клиента Salesforce OAuth Client Flow Doc

2) Взгляните на Toolkit для iOS на сайте разработчиков Force.com. Существует класс под названием ZKOAuthViewController, который практически все делает за вас. Остальная часть takelit основана на SOAP API Force.com, но я просто создал свой собственный контроллер входа в систему OAuth на основе набора инструментов и вместо этого использую REST API.

person Neil M    schedule 11.02.2011
comment
1) Итак, вы говорите, что мне нужно открыть UIWebView в моем приложении, чтобы получить токен? Есть ли способ обойти это? Я подумал, что вы можете использовать метод прямого имени пользователя и пароля - na8.salesforce. ru / help / doc / en / - person smcdrc; 11.02.2011
comment
Да, вы можете использовать метод имени пользователя и пароля, но тогда вам нужно будет встроить клиентский ключ и секрет в свой код, что не рекомендуется. - person Neil M; 11.02.2011
comment
2) Я не могу найти ZKOAuthViewController - person smcdrc; 11.02.2011
comment
Ссылка на файл на GitHub - person Neil M; 11.02.2011

Ответ Суперфелла почти правильный. Необходимо установить пароль:

пароль + токен безопасности

См. http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_concepts_security.htm для получения дополнительной информации.

person Castrohenge    schedule 01.12.2011