iOS Twitter Reverse OAuth

Llevo varios días intentando averiguar cómo implementar esto.

Necesito solicitar el token de acceso y el secreto de twitter para pasar esto a un server que procese los tweets de los usuarios para mi aplicación.

He estado siguiendo este enlace https://dev.twitter.com/docs/ios/using-reverse-auth

El problema es el paso 1. No te dan un ejemplo del paso 1.

Aquí está mi código:

NSURL *url = [NSURL URLWithString:TW_OAUTH_URL_REQUEST_TOKEN]; NSDictionary *parameters = @{TW_X_AUTH_MODE_KEY:TW_X_AUTH_MODE_REVERSE_AUTH}; SLRequest *getTwitterAuth = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:url parameters:parameters]; // Assume that we stonetworking the result of Step 1 into a var 'resultOfStep1' NSString *S = resultOfStep1; NSDictionary *step2Params = [[NSMutableDictionary alloc] init]; [step2Params setValue:@"kfLxMJsk7fqIuy8URhleFg" forKey:@"x_reverse_auth_target"]; [step2Params setValue:S forKey:@"x_reverse_auth_parameters"]; NSURL *url2 = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"]; SLRequest *stepTwoRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:url2 parameters:step2Params]; // You *MUST* keep the ACAccountStore alive for as long as you need an ACAccount instance // See WWDC 2011 Session 124 for more info. self.accountStore = [[ACAccountStore alloc] init]; // We only want to receive Twitter accounts ACAccountType *twitterType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; // Obtain the user's permission to access the store [self.accountStore requestAccessToAccountsWithType:twitterType withCompletionHandler:^(BOOL granted, NSError *error) { if (!granted) { // handle this scenario gracefully } else { // obtain all the local account instances NSArray *accounts = [self.accountStore accountsWithAccountType:twitterType]; // for simplicity, we will choose the first account returned - in your app, // you should ensure that the user chooses the correct Twitter account // to use with your application. DO NOT FORGET THIS STEP. [stepTwoRequest setAccount:[accounts objectAtIndex:0]]; // execute the request [stepTwoRequest performRequestWithHandler: ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSString *responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; // see below for an example response NSLog(@"The user's info for your server:\n%@", responseStr); }]; } }]; 

He estado tratando de averiguar cómo procesa la SLRequest para pasarla al paso 2 de los documentos de Twitter.

También he usado esto aquí: https://github.com/seancook/TWReverseAuthExample

Este código es genial pero muy complejo. ¡Cualquier ayuda sería muy apreciada! ¡Gracias!

La razón por la cual el primer paso no tiene ningún código es que asumen que lo harán en su server o antes, o algo por el estilo. Básicamente, necesita generar una key que su aplicación usará para convertir tokens iOS a tokens normales.

Hay un script que hará la request por usted aquí: http://www.ananseproductions.com/twitter-reverse-auth-headaches/ Está escrito en Ruby para que pueda usar algo similar si tiene un server Ruby.

Personalmente, haría que mi aplicación solicite esta ficha de mi server, luego haga la request a Twitter y luego publique la nueva contraseña en mi server.

Aquí hay una class para ayudar a lograr esto con una sola llamada de método que devuelve un dictionary con el token y el secreto del token.

https://github.com/kbegemn/Twitter-Reverse-Auth

Espero que esto ayude a otros!

A partir de este código https://github.com/seancook/TWReverseAuthExample , es bastante simple de implementar en su propia aplicación. Prefiero crear classs reutilizables, por lo que no tengo que implementar el mismo código varias veces. Normalmente, creas un singleton y trabajas con él en el siguiente tutorial. Sin embargo, el objective de esta instrucción no es enseñarle a crear singletons, por lo que, por el simple hecho de usarla, usaremos AppDelegate.h/m que es fácilmente accesible desde toda la aplicación.

Todo lo que tiene que hacer es lo siguiente:

  1. Abra el suyo y el proyecto de Sean Cook (el que tiene la URL arriba)

  2. Arrastre y copie Source-> Vendor-> ABOauthCore group en su proyecto

  3. Seleccione TWAPIManager.h/m , TWSignedRequest.h/m y cópielos en su proyecto

  4. Agregue el código siguiente en su file AppDelegate.h

    @property (nonatomic, strong) ACAccountStore * store;

    @property (nonatomic, strong) TWAPIManager * apiManager;

    @property (nonatomic, strong) NSArray * counts;

    – (void) storeAccountWithAccessToken: (NSString *) token secret: (NSString *) secret;

    – (void) performReverseAuth: (id) emisor inView: (UIView *) viewToDisplaySheet;

    – (vacío) _refreshTwitterAccounts;

  5. Ahora pegue los siguientes methods en su file AppDelegate.m

    – (vacío) actionSheet: (UIActionSheet *) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex;

    – (vacío) _refreshTwitterAccounts;

    – (void) _obtainAccessToAccountsWithBlock: (void (^) (BOOL)) bloque;

    – (void) performReverseAuth: (id) emisor inView: (UIView *) viewToDisplaySheet;

  6. En algún método de initialization de su file, o a partir de este ejemplo en: `application: didFinishLaunchingWithOptions 'pegue el siguiente código:

    _store = [[ACAccountStore alloc] init];

    _apiManager = [[TWAPIManager alloc] init];

    [[NSNotificationCenter defaultCenter] addObserver: auto selector: @selector (_refreshTwitterAccounts) nombre: ACAccountStoreDidChangeNotification object: nil];

  7. Recuerde eliminar el observador utilizando el siguiente código. AppDelegate.m en AppDelegate.m :

    – (void) dealloc {

     [[NSNotificationCenter defaultCenter] removeObserver:self]; 

    }

  8. Abra su file app-Info.plist y agregue 2 keys de cadena. Tome sus valores de: https://apps.twitter.com/

    TWITTER_CONSUMER_KEY

    TWITTER_CONSUMER_SECRET

  9. En el Controlador de vista que desea usar para implementar características de Twitter, en el método viewDidLoad , agregue el siguiente código:

    AppDelegate * appDelegate = [UIApplication shanetworkingApplication] .delegate;

    [appDelegate _refreshTwitterAccounts];

  10. Bien, finalmente estás listo para iniciar toda la máquina. En el Controlador de vista que desee usar para implementar características de Twitter, cree un UIButton llamado _reverseAuthBtn y cree una IBAction . Luego en su IBAction pegue el siguiente código:

    AppDelegate * appDelegate = [UIApplication shanetworkingApplication] .delegate;

    [appDelegate performReverseAuth: sender inView: self.view];

¡Supongo que eso es todo! Si no me he olvidado de nada, tienes la implementación de Twitter Reverse Oauth, y si quieres usarla en controlleres de múltiples vistas, todo lo que tienes que hacer es hacer los pasos 1-8 y luego pegar el código de los pasos 9 y 10 en su controller de vista.

¡Atentamente!

Usa esta lib, ¡funciona perfectamente!

https://github.com/nst/STTwitter

Información sobre cómo implementar: https://github.com/nst/STTwitter#reverse-authentication

🙂