Autenticación de iOS iOS

Comencé a desarrollar una aplicación para iOS en Swift. Ahora estoy en la parte donde necesito crear un sistema de inicio de sesión. Sin embargo, necesitamos la información de LinkedIn de las personas.

¿Cómo puedo usar la API de OAuth2 en iOS para lograr esto?

Ya creé una aplicación en el área de desarrolladores de LinkedIn, pero ahora estoy atascado. Recibí algunos consejos de alguien que necesito usar UIWebView pero no tengo ni idea de cómo funciona esto.

Integrando LinkedIn Login en una aplicación Swift

Primero, descargue el SDK de iOS de LinkedIn . Usaré la versión estable 1.07 para este ejemplo. Seguiré la guía de integración aquí .

  1. Crea una nueva aplicación de desarrollador .
  2. Agregue el identificador de paquete de su aplicación iOS a su aplicación de LinkedIn en dispositivos móviles.
  3. Agregue el Id. De su aplicación de LinkedIn y el Esquema de URL al archivo Info.plist de su aplicación.
  4. Incluya en la lista blanca los esquemas de URL de LinkedIn especificados y las URL de ATS.
  5. Copie la biblioteca linkedin-sdk.framework a su aplicación. Asegúrese de que estén seleccionados “copiar archivos si es necesario” y “crear grupos para referencias de carpeta”.

Configuración del proyecto completa, ¡ahora vamos a escribir un código!

Cree un nuevo archivo de encabezado llamado BridgingHeader.h . En Destinos -> YourApp -> Configuraciones de comstackción -> Swift Compiler – Code Generation, agrega MyApp/BridgingHeader.h a “Objective-C Bridging Header”.

En su BridgingHeader.h , agregue estas dos líneas:

 #import  #import  

En su AppDelegate.swift, agregue este código para manejar la callback de OAuth URL:

Swift 3:

 func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { if LISDKCallbackHandler.shouldHandle(url) { return LISDKCallbackHandler.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) } return true } 

Swift 2.x:

 func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { if LISDKCallbackHandler.shouldHandleUrl(url) { return LISDKCallbackHandler.application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) } return true } 

Ahora es el momento de iniciar sesión en el usuario. En su controlador de vista, supongamos que tiene un botón de “Iniciar sesión”. Su IBAction podría verse así:

 @IBAction func doLogin(sender: AnyObject) { LISDKSessionManager.createSessionWithAuth([LISDK_BASIC_PROFILE_PERMISSION], state: nil, showGoToAppStoreDialog: true, successBlock: { (returnState) -> Void in print("success called!") let session = LISDKSessionManager.sharedInstance().session }) { (error) -> Void in print("Error: \(error)") } } 

Al iniciar sesión, se le solicitará al usuario que se autentique con su aplicación:

LinkedIn

Si el usuario lo permite, se llamará al bloque de éxito y podrá obtener información sobre el usuario autenticado. Si el inicio de sesión falla o el usuario no permite el acceso, se llamará al bloque de fallas y podrá alertar al usuario sobre el problema que ocurrió.

Para obtener información sobre el usuario con el que nos hemos autenticado, llame a una solicitud GET en el perfil del usuario:

 let url = "https://api.linkedin.com/v1/people/~" if LISDKSessionManager.hasValidSession() { LISDKAPIHelper.sharedInstance().getRequest(url, success: { (response) -> Void in print(response) }, error: { (error) -> Void in print(error) }) } 

response.data contendrá información sobre el usuario autenticado:

 "{\n \"firstName\": \"Josh\",\n \"headline\": \"Senior Mobile Engineer at A+E Networks\",\n ... }" 

Lea los documentos más adelante para ver más cosas que puede hacer con la API.

Un proyecto de ejemplo (con mi ID de aplicación ofuscado) se puede encontrar aquí .

En Swift 3.0, se debe agregar UIApplicationOpenURLOptionsKey para Facebook y LinkedIn .

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { if LISDKCallbackHandler.shouldHandle(url) { return LISDKCallbackHandler.application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: nil) } else { return FBSDKApplicationDelegate.sharedInstance().application(app, open: url , options: options) } } 

LinkedIn es una bestia interesante, ya que sus SDK móviles tienen dos defectos:

  • Un usuario final NECESITA que se instale la aplicación LinkedIn; de lo contrario, el botón “iniciar sesión” redirigirá al usuario a la tienda de aplicaciones.
  • El token de acceso móvil no se puede usar en el servidor. Ver esta captura de pantalla de la documentación de iOS de LinkedIn

Entonces, aunque la respuesta de JAL es suficiente, es posible que desee estudiar la implementación del código de authorization_code OAuth de LinkedIn en su aplicación móvil en lugar del SDK de LinkedIn. Esto se vería más o menos como el siguiente flujo:

  1. La aplicación redirigirá al usuario a su servidor web.
  2. El servidor web comienza el flujo de autenticación de LinkedIn y redirige al usuario a LinkedIn.
  3. El usuario inicia sesión en LinkedIn y recibe una redirección a su servidor web.
  4. El servidor web lee la respuesta e intercambia el código de autorización con LinkedIn por un token de acceso.
  5. El servidor web redirige a su usuario a la aplicación, utilizando un esquema de URL personalizado para enviar el token de acceso de LinkedIn.
  6. La aplicación usa el token de acceso de LinkedIn para iniciar sesión en Stormpath.

¿Suena complicado? En realidad es más sencillo de lo que parece. De hecho, escribí un código de demostración para este flujo usando Express.js y Swift . Este ejemplo finalmente envía el token de acceso a Stormpath para autenticar al usuario en última instancia, pero siempre puede reemplazarlo con su propio código que llama a la API de REST de LinkedIn para captar la información del perfil .

Actualización de la respuesta de Edward Jiang; cambios es acceso simbólico en el servidor + lado móvil. Fuente: https://developer.linkedin.com/docs/ios-sdk-auth

Sé que esto ya se ha respondido, pero también me he enfrentado a este problema y he hecho todo lo que se establece en la respuesta Aceptada, pero por alguna razón el código todavía no estaba llegando al éxito o al fracaso. Resultó que con iOS 9 lo siguiente está en desuso.

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 

La solución fue usar esto en su lugar:

 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options 

Por ejemplo, podrías hacer:

 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { if ([LISDKCallbackHandler shouldHandleUrl:url]) { return [LISDKCallbackHandler application:app openURL:url sourceApplication:options[UIApplicationLaunchOptionsSourceApplicationKey] annotation:options[UIApplicationLaunchOptionsAnnotationKey]]; } return YES; }