Browsing posts in: Windows Phone 8

Habilitar Single Sign-On con Mobile Services y el Live SDK en Windows Phone 8 y Windows 8 con C#

Vamos al grano, lo que queremos: autenticar automágicamente a un usuario cuando se abra la aplicación, que sólo tenga que meter su usuario y contraseña una sola vez, la primera vez que abre la app.

Como soluciones posibles, Quique y yo, fuimos a por la forma “sencilla” en WinJS: serializar y guardar el usuario en local, luego checkear el usuario antes de intentar autenticarlo otra vez, pero hay una mejor forma de hacerlo: habilitar el Single Sign-On del Live SDK, autenticarte con él en la aplicación de Live que debes tener creada igualmente si quieres el provider de la Microsoft Account en Mobile Services y luego usar la sobrecarga del método LoginAsync que toma como argumento una string con el token que te devuelve la autenticación del Live. Vamos allá:

En Windows Phone 8

En un método Authenticate que queráis. Como nota, en Windows Phone 8, los métodos de autenticación deben ir en el Loaded, más que en el OnNavigatedTo para no hacer guarradas, ya que en WP8 se navega a otra página para hacer el logueo y pedir permisos, no así en W8, por lo que tendríais 2 OnNavigatedTo, causando una excepción si no implementáis un centinela (caí en esto gracias a Gorka en el mail de soporte):


while (liveSession == null)
 {

var authClient = new LiveAuthClient("<<TU ID DE APP>>");

string [] reqs = new[] { "wl.signin", "wl.basic", "wl.offline_access" };
 var init = await authClient.InitializeAsync(reqs);

var session = authClient.Session;

if (init.Status != LiveConnectSessionStatus.Connected)
 {
 MessageBox.Show("This app needs an authenticated user to work, please check mygym.azurewebsites.net  for info & privacy", "Please Log in", MessageBoxButton.OK); //cambia por tu sitio
 var logStatus = await authClient.LoginAsync(reqs);

if (logStatus.Status == LiveConnectSessionStatus.Connected)
 {
//primer login
 session = logStatus.Session;
 liveSession = session;
 LiveConnectClient client = new LiveConnectClient(liveSession);
 LiveOperationResult meResult = await client.GetAsync("me");
 string title = string.Format("Welcome {0}!", meResult.Result["first_name"]);
 MessageBox.Show("Welcome to My Gym for the first time, please check mygym.azurewebsites.net for more info or how-to.", title, MessageBoxButton.OK); //reemplazad con vuestros datos
 user = await mobileServiceClient.LoginAsync(session.AuthenticationToken); //esta es la autenticación hacia Mobile Services
 }
 }

if (init.Status == LiveConnectSessionStatus.Connected)
 {
 //el resto de logins
 liveSession = session;
 user = await mobileServiceClient.LoginAsync(session.AuthenticationToken); //autenticación contra Mobile Services
 }

}

Con esto ya lo tenéis acabado, sólo os pedirá user/pass la primera vez que se ejecute la app después de cada instalación.

En Windows 8

Aquí es más o menos lo mismo, aunque el Authenticate puede ir en un OnNavigatedTo, ya que internamente usa WebAuthBroker, que no navega a otra página, sino que saca un pop-up. Lo que cambia es la forma de inicializar el cliente de Live, que no se inicializa con el ID de la app, sino con la URL de callback, además de haber simplificado el código, quitando un par de llamadas al Live para obtener el nombre, por ejemplo:

var authClient = new LiveAuthClient("<<URL DE TU SERVICIO>>");

            reqs = new[] { "wl.signin", "wl.basic", "wl.offline_access" };
            var init = await authClient.InitializeAsync(reqs);

            var session = authClient.Session;

            if (init.Status != LiveConnectSessionStatus.Connected)
            {
                //hay que autenticarse
                var logStatus = await authClient.LoginAsync(reqs);

                if (logStatus.Status == LiveConnectSessionStatus.Connected)
                {
                    //primera autenticación
                    session = logStatus.Session;
                    user = await mobileServiceClient.LoginAsync(session.AuthenticationToken);
                }
            }

            if (init.Status == LiveConnectSessionStatus.Connected){
            //resto de logins
            user = await mobileServiceClient.LoginAsync(session.AuthenticationToken);

            }

¡Todo hecho!. ¿Dudas? Tenéis los comentarios 🙂