Твиттер + кошмар - PullRequest
       8

Твиттер + кошмар

3 голосов
/ 02 декабря 2009

Я пытаюсь реализовать пользовательский вид входа в Twitter (мне не нужен этот UIWebView). Я скачал много классов, и у меня до сих пор кошмар с этим. Сейчас я пытаюсь заставить Twitter + oAuth работать. Вот демонстрационный код (который работает):

_engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];
_engine.consumerKey = kOAuthConsumerKey;
_engine.consumerSecret = kOAuthConsumerSecret;

[_engine requestRequestToken];

UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

if (controller) 
    [self presentModalViewController: controller animated: YES];
else
    [_engine sendUpdate: [NSString stringWithFormat: @"Already Updated. %@", [NSDate date]]];

Теперь я хочу заменить SA_OAuthTwitterController на пользовательские UITextFields. Итак, я пытаюсь это:

_engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];
_engine.consumerKey = kOAuthConsumerKey;
_engine.consumerSecret = kOAuthConsumerSecret;

[_engine requestRequestToken];
[_engine requestAccessToken];
[_engine setUsername:@"username" password:@"password"];
[_engine sendUpdate:@"tweet"];

Но я продолжаю получать ошибку 401. Я, вероятно, пропускаю шаг. Кто-нибудь?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2009

Контроллер, который вы удаляете, загружает веб-просмотр, который предлагает пользователю аутентифицировать ваше приложение с помощью твиттера. Если у вас никогда не будет аутентификации пользователя, вы не сможете совершать аутентифицированные твиттер-звонки. Есть способ сделать то, что вы хотите, однако вы должны пройти все этапы OAuth самостоятельно. Вот шаги, указанные для другого веб-сервиса (Vimeo) , но применяются те же правила:

  1. Ваша заявка отправляет запрос с вашим ключом потребителя, и подписал с вашим потребительским секретом, для то, что называется токеном запроса. Если мы проверяем вашу заявку правильно, мы отправим вам обратно запросить токен и секретный токен.

  2. Затем вы создадите ссылку, по которой пользователь сможет щелкнуть токеном запроса.

  3. Когда пользователь доберется до Vimeo, ему будет предложено разрешить доступ приложения к своей учетной записи. Если они нажмут да, мы отправим их вернуться к вашему заявлению вместе с верификатор.

  4. Затем вы будете использовать токен запроса, верификатор и секрет токена, чтобы сделать
    еще один звонок к нам, чтобы получить доступ маркер. Токен доступа - это то, что вы будете использовать для доступа к пользователю информация о Vimeo.

OAuth - настоящая боль в попе, так что удачи. ; -)

1 голос
/ 17 августа 2010

Вы должны использовать xAuth для пользовательских элементов управления / проходов. Но для этого требуется разрешение от Twitter.

1 голос
/ 02 декабря 2009

Я думаю, что бит, который вам не хватает, находится здесь, SA_OAuthTwitterEngine.m: 103:

    //This generates a URL request that can be passed to a UIWebView. It will open a page in which the user must enter their Twitter creds to validate
- (NSURLRequest *) authorizeURLRequest {
        if (!_requestToken.key && _requestToken.secret) return nil;     // we need a valid request token to generate the URL

        OAMutableURLRequest *request = [[[OAMutableURLRequest alloc] initWithURL: self.authorizeURL consumer: nil token: _requestToken realm: nil signatureProvider: nil] autorelease];     

        [request setParameters: [NSArray arrayWithObject: [[[OARequestParameter alloc] initWithName: @"oauth_token" value: _requestToken.key] autorelease]]];   
        return request;
}

Вам придется «подделать» логин этого пользователя, я полагаю, отправив в твиттер учетные данные для входа в виде отдельного запроса. Похоже, что метод setUsername, который вы вызываете, фактически вызывается как операция post после получения действительного токена доступа. См. SA_OAuthTwitterEngine.m: 185

//
// access token callback
// when twitter sends us an access token this callback will fire
// we store it in our ivar as well as writing it to the keychain
// 
- (void) setAccessToken: (OAServiceTicket *) ticket withData: (NSData *) data {
        if (!ticket.didSucceed || !data) return;

        NSString *dataString = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease];
        if (!dataString) return;

        if (self.pin.length && [dataString rangeOfString: @"oauth_verifier"].location == NSNotFound) dataString = [dataString stringByAppendingFormat: @"&oauth_verifier=%@", self.pin];

        NSString                                *username = [self extractUsernameFromHTTPBody:dataString];

        if (username.length > 0) {
                [[self class] setUsername: username password: nil];
                if ([_delegate respondsToSelector: @selector(storeCachedTwitterOAuthData:forUsername:)]) [(id) _delegate storeCachedTwitterOAuthData: dataString forUsername: username];
        }

        [_accessToken release];
        _accessToken = [[OAToken alloc] initWithHTTPResponseBody:dataString];
}

Итак, шаги следующие:

  1. Запросить токен
  2. Фальшивый пользователь, войдите в твиттер и получите пин-код
  3. Установить штифт на двигатель
  4. Запрос токена доступа

Вы можете увидеть, где SA_OAuthTwitterController анализирует вывод содержимого веб-просмотра в SA_OAuthTwitterController.m: 156

#pragma mark Webview Delegate stuff
- (void) webViewDidFinishLoad: (UIWebView *) webView {
        NSError *error;
        NSString *path = [[NSBundle mainBundle] pathForResource: @"jQueryInject" ofType: @"txt"];
    NSString *dataSource = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];

    if (dataSource == nil) {
        NSLog(@"An error occured while processing the jQueryInject file");
    }

        [_webView stringByEvaluatingJavaScriptFromString:dataSource]; //This line injects the jQuery to make it look better

        NSString                                        *authPin = [[_webView stringByEvaluatingJavaScriptFromString: @"document.getElementById('oauth_pin').innerHTML"] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

        if (authPin.length == 0) authPin = [[_webView stringByEvaluatingJavaScriptFromString: @"document.getElementById('oauth_pin').getElementsByTagName('a')[0].innerHTML"] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

        [_activityIndicator stopAnimating];
        if (authPin.length) {
                [self gotPin: authPin];
        } 
        if ([_webView isLoading] || authPin.length) {
                [_webView setHidden:YES];
        } else {
                [_webView setHidden:NO];
        }
}

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...