Подтвердить что ты не робот

Получение Twitter OAuth Token с использованием социальных рамок (iOS6)

Я немного смущен тем, как я получаю токен OAuth Twitter, используя iOS Social Framework. Предполагая, что у меня установлена ​​учетная запись Facebook и Twitter на iOS6, и я могу получить ACAccount. Когда я проверяю ACAccountCredential для ACAccount Facebook, устанавливается свойство OAuthToken, но для ACAccount Twitter это не так. Каждая другая деталь для ACAccount Twitter устанавливается только для ACAccountCredential.

Чтобы добавить к путанице, я наткнулся на статью об использовании Reverse Auth, чтобы получить токен OAuth (https://dev.twitter.com/docs/ios/using-reverse-auth). В этой статье говорится о вызове https://api.twitter.com/oauth/request_token и передаче в словаре параметров oauth_ * params, например. consumer_key, nononce и т.д. Но, верно, для этого служит привязка моего ACAccount к SLRequest? В любом случае я возвращаю ошибку "Не удалось проверить oauth подпись и токен", когда я это пробую.

Итак, мой вопрос в том, должен ли я видеть токен OAuth Twitter в ACAccountCredential или использовать Reverse Auth? и если да, должен ли я иметь явный проход в NSDictionary, содержащий параметры oauth_ * или прикрепляет ACAccount достаточно?

4b9b3361

Ответ 1

Позвольте ответить на этот вопрос в несколько шагов, есть несколько вещей, которые требуют адресации/уточнения.

ACAccountCredential

Этот объект используется в координации с объектом ACAccount, чтобы структура учетных записей могла аутентифицировать пользователя для определенной учетной записи. Он не предназначен для чтения по желанию; он должен использоваться только тогда, когда вам нужно сохранить учетную запись в структуре учетных записей.

Документация из Twitter заявляет, что вам нужно заполнить ACAccountCredential, если вы переходите на платформу учетных записей для управления учетными записями пользователей, вместо использования собственных серверов, или в случае старого приложения iOS, управляя учетными записями самостоятельно.

Apple четко заявляет в своей документации, что учетные данные не могут быть прочитаны после сохранения учетной записи в структуре учетных записей.

В целях конфиденциальности это свойство недоступно после сохранения учетной записи.

Таким образом, именно поэтому Twitter предоставляет возможность использовать обратную аутентификацию, если вам по-прежнему нужен токен OAuth для управления на стороне сервера. Я не знаю, почему вы можете получить его для учетной записи Facebook, но для Twitter вы не можете перейти прямо к предварительно сохраненному ACAccountCredential.

Использование функции Twitter Reverse Auth

Документация, предоставленная Twitter (связанная в вашем вопросе), делает процесс достаточно ясным из того, что вам нужно сделать, чтобы получить доступ к токену доступа OAuth, но я попытаюсь прояснить некоторые вещи, которые могут быть не столь ясными.

Для создания этой работы необходима дополнительная структура, помимо структуры учетных записей и Twitter. Social.framework. Убедитесь, что это импортировано, так как это значительно упростит запрос маркера.

Что касается запроса, который вам нужно отправить, Twitter не знает ACAccounts. Помните, что этот обратный процесс аутентификации не относится к iOS, это может быть сделано с помощью любого вычислительного устройства, имеющего доступ к сети. Таким образом, вам нужно отправить запрос HTTP POST на https://api.twitter.com/oauth/request_token с указанными параметрами (стандартными OAuth + x_auth_mode). Более подробную информацию о требуемых параметрах можно найти здесь, но ссылка на ваш вопрос также уточнит, какие параметры требуются. Вы должны будете предоставить свои собственные значения nonce и другие значения параметров.

Вы можете использовать класс SLRequest или AFNetworking, чтобы сделать ваш запрос POST в Twitter, передав NSDictionary для ваших значений параметров (как видно из примера кода в документации Twitter для access_token).

И что он

После ответа на эти два момента я думаю, что вам нужно использовать обратную аутентификацию, чтобы получить доступ к правильному токену OAuth для ваших нужд. Документация Twitter дает понять, что вам нужно делать (она даже предоставляет примеры кода, которые вы можете использовать), но для этого вам нужно знать об общем запросе/ответе OAuth. Вы не можете просто присоединить ACAccount, вам нужно заполнить словарь требуемыми параметрами OAuth, а затем передать это в свой HTTP-запрос POST на request_token. Я предоставил значительное количество ссылок, на которые вы ссылаетесь, и я надеюсь, что это положит вас на правильный путь.

Ответ 2

Предполагая, что вы собираетесь попробовать это нa >= iOS 5.0, вот более простой способ получить токен доступа. Независимо от того, используете ли вы программу Twitter.framework или Social.framework, как работает работа, так и подписывая запрос. Для создания вашего запроса мы используем TWRequest или SLRequest. Как только мы закончим с этим, мы получим объект NSURLRequest из любого из них.

Трюк здесь - посмотреть на заголовки этого NSURLRequest. Поскольку мы должны указывать, согласно стандартам OAuth, несколько параметров OAuth и oauth_token, являющихся одним из них, его должно быть легко извлечь. Ниже приведен способ получить это.

NSURLRequest * reqTemp = /* Prepare the request using either Twitter.framework or Social.framework */;
NSDictionary * dictHeaders = [reqTemp allHTTPHeaderFields];

NSString * authString = dictHeaders[@"Authorization"];
NSArray * arrayAuth = [authString componentsSeparatedByString:@","];
NSString * accessToken;
for( NSString * val in arrayAuth ) {
    if( [val rangeOfString:@"oauth_token"].length > 0 ) {
        accessToken =
            [val stringByReplacingOccurrencesOfString:@"\""
                                           withString:@""];
        accessToken =
            [accessToken stringByReplacingOccurrencesOfString:@"oauth_token="
                                                        withString:@""];
        break;
    }
}

Возможно, этот код можно оптимизировать, но вы получите эту идею. Переменная accessToken будет иметь действительный токен доступа.

Ответ 3

На самом деле, если вы только хотите получить токен OAuth, есть очень простой способ получить доступ к нему с помощью Social Framework. Внутри документации находится метод, называемый:

func preparedURLRequest() -> NSURLRequest!

Возвращаемое значение Объект NSURLRequest, совместимый с OAuth, который позволяет приложение действовать от имени пользователя при сохранении пароля пользователя частный. NSURLRequest подписывается как OAuth1 по умолчанию, или OAuth2 добавив соответствующий токен на основе учетной записи пользователя.

Обсуждение Используйте этот метод для изменения вашего запроса перед отправкой. От правильно установив учетную запись, этот метод автоматически добавит необходимые токены.

Итак, вы можете просто создать подписанный SLRequest следующим образом:

let accounts = self.accountStore.accountsWithAccountType(type)
let request = SLRequest(
                forServiceType: SLServiceTypeTwitter,
                requestMethod: .GET,
                URL: NSURL(string: "https://api.twitter.com/1.1/account/verify_credentials.json"),
                parameters: ["include_entities": true])      
request.account = accounts?.first as? ACAccount

и теперь просто получить доступ к request.preparedURLRequest().allHTTPHeaderFields() И вы увидите oauth_token в нем.

Однако у вас не будет секретного токена (потому что он использовал для генерации oauth_signature как twitter documentation), что делает это довольно бесполезно для управления на стороне сервера.