new developer desarrollador cuenta clave app ios twitter-oauth social-framework

developer - Recuperar el token de Twitter OAuth utilizando el marco social(iOS6)



twitter login ios (4)

Echa un vistazo a este proyecto https://github.com/seancook/TWReverseAuthExample . Hay una clase de TWAPIManager que hace el trabajo por ti.

Estoy un poco confundido en cuanto a cómo obtengo el Twitter OAuth Token utilizando el marco social de iOS. Suponiendo que tengo una cuenta de Facebook y Twitter configurada en iOS6, y puedo obtener la cuenta ACA. Cuando reviso ACAccountCredential para Facebook ACAccount, la propiedad OAuthToken está establecida, pero para Twitter ACAccount no lo está. Todos los demás detalles de la cuenta ACA de Twitter se configuran, pero el ACAccountCredential no está configurado.

Para agregar a la confusión, encontré un artículo sobre el uso de Reverse Auth para obtener el token de OAuth ( https://dev.twitter.com/docs/ios/using-reverse-auth ). Este artículo habla sobre llamar a https://api.twitter.com/oauth/request_token y pasar un diccionario de oauth_ * params params por ejemplo consumer_key, nononce, etc. Pero, seguramente, ¿adjuntar mi ACAccount al SLRequest sirve para este propósito? En cualquier caso, recibo el error "Error al validar una firma y un token" cuando intento esto.

Entonces, mi pregunta es si debo ver el token OAuth de Twitter en ACAccountCredential o ¿debo usar la autenticación inversa? y si es así, ¿necesito pasar explícitamente el NSDictionary que contiene los parámetros oauth_ * o adjuntar la cuenta AC es suficiente?


En realidad, si su única preocupación es recuperar el token de OAuth, hay una forma muy sencilla de acceder a este mediante el Marco Social . Dentro de la documentación se encuentra un método llamado:

func preparedURLRequest() -> NSURLRequest!

Valor de retorno Un objeto NSURLRequest compatible con OAuth que permite que una aplicación actúe en nombre del usuario mientras mantiene la contraseña del usuario privada. El NSURLRequest se firma como OAuth1 de forma predeterminada, o OAuth2 al agregar el token apropiado en función de la cuenta del usuario.

Discusión Use este método para modificar su solicitud antes de enviar. Al configurar la cuenta correctamente, este método agregará automáticamente todos los tokens necesarios.

Así que simplemente puedes crear una SLRequest firmada como esta:

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

y ahora simplemente acceda al request.preparedURLRequest().allHTTPHeaderFields() Y verá el oauth_token en él.

Sin embargo, no tendrá el token Secreto (porque se usa para generar la oauth_signature del oauth_signature nombre que la documentación de Twitter ), lo que hace que esto sea bastante inútil para la administración del lado del servidor.


Respondamos a esto en unos pocos pasos, hay algunas cosas que deben abordarse o aclararse.

ACAccountCredential

Este objeto se usa en coordinación con un objeto ACAccount, para que el marco de cuentas pueda autenticar al usuario para una cuenta en particular. No está diseñado para ser leído a voluntad; solo se supone que debe usarse cuando necesite guardar una cuenta en el marco de cuentas.

La documentación de Twitter indica que debe completar un ACAccountCredential si está migrando al marco de cuentas para administrar sus cuentas de usuario, en lugar de usar sus propios servidores, o en el caso de una aplicación iOS más antigua, administre las cuentas de manera local.

Apple dice claramente en su documentación que las credenciales no se pueden leer después de que la cuenta se haya guardado en el marco de las cuentas.

Por razones de privacidad, esta propiedad es inaccesible después de guardar la cuenta.

Como tal, esta es la razón por la que Twitter proporciona la capacidad de usar la autenticación inversa, en caso de que aún necesite el token OAuth para la administración del lado del servidor. No sé por qué puedes obtenerlo para una cuenta de Facebook, pero para Twitter no puedes ir directamente a un ACAccountCredential guardado previamente.

Usando la autenticación inversa de Twitter

La documentación proporcionada por Twitter (vinculada en su pregunta) hace que el proceso sea bastante claro sobre lo que debe hacer para acceder al token de acceso de OAuth, pero intentaré aclarar algunas cosas que pueden no ser tan claras.

Se requiere un marco adicional, además del marco de Cuentas y Twitter, para hacer que esto funcione; Social.framework . Asegúrese de que esto se importa, ya que esto hará que la solicitud del token sea mucho más sencilla.

En cuanto a la solicitud que necesita enviar, Twitter no tiene conocimiento de ACAccounts. Recuerde que este proceso de autenticación inversa no es específico de iOS, puede ser realizado por cualquier dispositivo informático con acceso a la web. Como tal, debe enviar una solicitud HTTP POST a https://api.twitter.com/oauth/request_token con los parámetros especificados (OAuth standard ones + x_auth_mode ). Puede encontrar un poco más de claridad sobre los parámetros requeridos aquí , pero el enlace en su pregunta también aclarará qué parámetros son necesarios. Se le pedirá que proporcione su propio nonce y otros valores de parámetros.

Puede usar la clase SLRequest o AFNetworking para hacer su solicitud POST a Twitter, pasando un NSDictionary para sus valores de parámetros (como se ve en el ejemplo de código en la documentación de Twitter para access_token ).

Y eso es

Después de responder esos dos puntos, creo que está claro que necesitará usar la autenticación inversa para acceder al token OAuth correcto para sus necesidades. La documentación de Twitter aclara qué debe hacer (incluso proporciona ejemplos de código que puede usar), pero debe conocer la gestión general de solicitud / respuesta de OAuth para poder hacerlo. No puede simplemente adjuntar una ACAccount, debe rellenar un diccionario con los parámetros OAuth requeridos y luego pasar esto a su solicitud HTTP POST a request_token . He proporcionado un número considerable de referencias para que las pueda consultar, y espero que lo pongan en el camino correcto.


Suponiendo que va a probar esto en> = iOS 5.0, esta es una forma más fácil de obtener el token de acceso. Independientemente de si está utilizando Twitter.framework o Social.framework, la forma en que ambos trabajan es mediante la firma de la solicitud por usted. Usamos TWRequest o SLRequest para crear su solicitud. Una vez que hayamos terminado con esto, obtenemos el objeto NSURLRequest de cualquiera de estos.

El truco aquí es mirar los encabezados de esta solicitud NSURL. Como tenemos que especificar, según los estándares de OAuth, algunos de los parámetros de OAuth y uno de ellos como auth_token, debería ser fácil de extraerlos. A continuación se muestra una forma de sacar esto.

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

Puede ser que este código se pueda optimizar más pero entiendes la idea. La variable accessToken tendrá el token de acceso real.