Adición de la autenticación a la aplicación Xamarin.Android
Información general
En este tema se muestra cómo autenticar usuarios de una aplicación móvil desde la aplicación cliente. En este tutorial podrá agregar la autenticación al proyecto de inicio rápido mediante un proveedor de identidades compatible con Azure Mobile Apps. Una vez que la aplicación móvil finalice la autenticación y autorización correctamente, se mostrará el valor del identificador de usuario.
Este tutorial se basa en el inicio rápido de aplicaciones móviles. Primero debe completar el tutorial Creación de una aplicación Xamarin.Android. Si no usa el proyecto de servidor de inicio rápido descargado, debe agregar el paquete de extensión de autenticación al proyecto. Para obtener más información acerca de los paquetes de extensión de servidor, consulte Trabajar con el SDK del servidor back-end de .NET para Aplicaciones móviles de Azure.
Registro de la aplicación para la autenticación y configuración de App Services
En primer lugar, debe registrar la aplicación en el sitio del proveedor de identidades y, a continuación, establecerá las credenciales generadas por el proveedor en el back-end de Mobile Apps.
Configure el proveedor de identidades preferido siguiendo las instrucciones específicas del proveedor:
Repita los pasos anteriores para cada proveedor que desee admitir en su aplicación.
Adición de la aplicación a las direcciones URL de redirección externa permitidas
La autenticación segura requiere que se defina un nuevo esquema de dirección URL para la aplicación. Esto permite que el sistema de autenticación se redirija a la aplicación una vez completado el proceso de autenticación. En este tutorial, se usará el esquema de dirección URL appname. Sin embargo, puede utilizar cualquier otro esquema de dirección URL que elija. Debe ser único para la aplicación móvil. Para habilitar la redirección en el lado de servidor:
En [Azure Portal], seleccione App Service.
Haga clic en la opción de menú Autenticación/autorización.
En URL de redirección externas permitidas, introduzca
url_scheme_of_your_app://easyauth.callback
. El valor de esquema_de_dirección_URL_de_la_aplicación de esta cadena es el esquema de dirección URL para la aplicación móvil. Debe seguir la especificación normal de las direcciones URL para un protocolo (usar únicamente letras y números, y comenzar por una letra). Debe tomar nota de la cadena que elija ya que necesitará ajustar el código de la aplicación móvil con el esquema de direcciones URL en varios sitios.Haga clic en OK.
Haga clic en Save(Guardar).
Restricción de los permisos para los usuarios autenticados
De forma predeterminada, se pueden invocar las API en un back-end de Mobile Apps de forma anónima. A continuación, deberá restringir el acceso a solo los clientes autenticados.
Back-end de Node.js (a través de Azure Portal):
En la configuración Mobile Apps, haga clic en Tablas fáciles y seleccione la tabla. Haga clic en Cambiar permisos, seleccione Solo acceso autenticado para todos los permisos y luego haga clic en Guardar.
Back-end de .NET (C#):
En el proyecto de servidor, vaya aControllersTodoItemController.cs>. Agregue el atributo
[Authorize]
a la clase TodoItemController , como sigue. Para restringir el acceso solo a determinados métodos, también puede aplicar este atributo solo a esos métodos en lugar de la clase. Vuelva a publicar el proyecto de servidor.[Authorize] public class TodoItemController : TableController<TodoItem>
Back-end de Node.js (a través del código de Node.js) :
Para pedir autenticación para acceder a las tablas, agregue la siguiente línea al script del servidor de Node.js:
table.access = 'authenticated';
Para más información, consulte Autenticación necesaria para el acceso a las tablas. Para obtener información sobre cómo descargar el proyecto de código de inicio rápido desde su sitio, consulte Cómo: descargar el proyecto de código de inicio rápido de back-end de Node.js con Git.
En Visual Studio o Xamarin Studio, ejecute el proyecto de cliente en un dispositivo o emulador. Compruebe que se produce una excepción no controlada con el código de estado 401 (No autorizado) después de iniciarse la aplicación. Esto sucede porque la aplicación intenta obtener acceso al back-end de la aplicación móvil como usuario sin autenticar. La tabla TodoItem ahora requiere autenticación.
Luego, actualizará la aplicación cliente para solicitar recursos del back-end de la aplicación móvil con un usuario autenticado.
Incorporación de autenticación a la aplicación
La aplicación se actualiza para requerir a los usuarios que pulsen el botón Iniciar sesión y que se autentiquen para que se muestren los datos.
Agregue el siguiente código a la clase TodoActivity :
// Define an authenticated user. private MobileServiceUser user; private async Task<bool> Authenticate() { var success = false; try { // Sign in with Facebook login using a server-managed flow. user = await client.LoginAsync(this, MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}"); CreateAndShowDialog(string.Format("you are now logged in - {0}", user.UserId), "Logged in!"); success = true; } catch (Exception ex) { CreateAndShowDialog(ex, "Authentication failed"); } return success; } [Java.Interop.Export()] public async void LoginUser(View view) { // Load data only after authentication succeeds. if (await Authenticate()) { //Hide the button after authentication succeeds. FindViewById<Button>(Resource.Id.buttonLoginUser).Visibility = ViewStates.Gone; // Load the data. OnRefreshItemsSelected(); } } public override void OnResume() { base.OnResume(); Xamarin.Essentials.Platform.OnResume(); }
Esto crea un método nuevo para autenticar un usuario y un controlador de método para un nuevo botón Iniciar sesión . El usuario del código de ejemplo anterior se autentica mediante el inicio de sesión en Facebook. Se usa un cuadro de diálogo para mostrar el identificador de usuario una vez autenticado.
Nota
Si usa un proveedor de identidades que no sea una cuenta de Facebook, cambie el valor que usó con LoginAsync por uno de los siguientes: MicrosoftAccount, Twitter, Google o WindowsAzureActiveDirectory.
En el método OnCreate , elimine o convierta en comentario la siguiente línea de código:
OnRefreshItemsSelected ();
En el archivo Activity_To_Do.axml, agregue la siguiente definición del botón LoginUser antes del botón AddItem existente:
<Button android:id="@+id/buttonLoginUser" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="LoginUser" android:text="@string/login_button_text" />
Agregue el siguiente elemento al archivo de recursos Strings.xml:
<string name="login_button_text">Sign in</string>
Abra el archivo AndroidManifest.xml, agregue el código siguiente dentro del elemento XML
<application>
:<activity android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity" android:launchMode="singleTop" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="{url_scheme_of_your_app}" android:host="easyauth.callback" /> </intent-filter> </activity>
En Visual Studio o Xamarin Studio, ejecute el proyecto de cliente en un dispositivo o emulador, e inicie sesión con el proveedor de identidades elegido. Una vez iniciada la sesión correctamente, la aplicación mostrará el identificador de inicio de sesión y la lista de tareas pendientes, y podrá realizar actualizaciones en los datos.
Solución de problemas
La aplicación se ha bloqueado con Java.Lang.NoSuchMethodError: No static method startActivity
En algunos casos, los conflictos en los paquetes de soporte aparecen como simples advertencias en Visual Studio, pero la aplicación se bloquea con esta excepción en tiempo de ejecución. En este caso tiene que asegurarse de que todos los paquetes de soporte a los que se hace referencia en el proyecto tengan la misma versión. El paquete NuGet de Azure Mobile Apps tiene la dependencia Xamarin.Android.Support.CustomTabs
para la plataforma Android, por lo que si el proyecto usa paquetes de soporte más recientes, tiene que instalar este paquete con la versión necesaria directamente para evitar conflictos.