Usando la API de Office 365


Muy buenas de nuevo a todos,

En la entrada anterior, os contaba como registrar aplicaciones en nuestro Azure AD, y os contaba que lo utilizaría posteriormente para crear aplicaciones web que pudieran acceder a la API de Office 365. Hoy os quiero contar como preparar un proyecto MVC para acceder y usar esta API y mostrar el código que he creado para probarlo todo.

Registrando una aplicación en Azure Active Directory

Actualmente disponemos de muchas opciones cuando nos planteamos extender nuestra plataforma de Office 365, y en función de los requerimientos podremos elegir unas u otras. Si lo que queremos es extender nuestro SharePoint OnLine, podemos optar por desarrollar una SharePoint Hosted o SharePoint Provider App, que nos permitirán manipular la información  de nuestro SharePoint en Office 365 por medio de API REST, JSOM o CSOM. Si en lugar de eso, queremos extender la funcionalidad de nuestro Office 365, y acceder y manipular la información de todo la suite de productividad, entonces podremos usar la API de Office 365, que no solo nos da acceso a SharePoint, sino que nos permite trabajar con Outlook, One Drive, Calendarios, etc.

Esta API de Office 365 y el modelo de aplicaciones de azure registradas en el Azure AD, parece que le va ganando mucho terreno al conjunto tradicional de opciones de desarrollo para SharePoint OnLine. La pregunta ahora es cual de todos ellos tendrá mayor proyección. Recientemente en algún WebCast, he preguntado sobre estos temas a algunos de los MVPs de SharePoint de España, y como conclusión creo que saco en claro que, si bien este último modelo que os comentaba y la API de Office 365 parece que seguirán creciendo y ganando en importancia, las apps para SharePoint y el modelo de objetos de cliente que se está convirtiendo en la herramienta básica de trabajo para los desarrolladores en SharePoint, seguirá teniendo su hueco en este mundo de posibilidades.

Así que toca empezar a ver cómo trabajar con esta API y este es el motivo de esta entrada, una primera toma de contacto con la API de Office 365. Para ello voy a desarrollar un proyecto MVC de ejemplo.

Creando y preparando el proyecto

Previo a empezar con el proyecto, es importante haber registrado en Azure AD una aplicación, para lo que recomiendo leer la entrada que os comentaba al principio del post.

En primer lugar vamos a crear un proyecto web de ASP.NET y seleccionaremos la plantilla MVC. Seleccionamos la plantilla porque ya lleva toda la configuración necesaria de autenticación que, en el caso de hacerlo a partir de un proyecto vacío, tendríamos que configurar a mano.

authentication

Cambiaremos el tipo de autenticación para seleccionar que queremos una autenticación contra Azure AD, y ahí indicaremos los parámetros necesarios.

dataorganizational

En el valor de App ID Url, seleccionaremos el mismo que el que indicamos cuando registramos nuestra aplicación en Azure AD y seleccionaremos la opción de sobreescribir si existe.

Una vez que se ha creado el proyecto, antes de continuar, tenemos que instalar de Nuget la Azure Directory Authentication Library (ADAL).

azure1adal

Y a continuación vamos a project->Add->Connected Services. Ahí nos pedirá registrar nuestra App y a continuación nos mostrará todos los servicios que tenemos disponibles de Office 365. Aquí podremos conceder distintos permisos a nuestra app con respecto a los servicios disponibles.

register permissions

Tras seleccionar los que queremos, vamos a properties y vamos a eliminar de las Urls de retorno la que no va con SSL, esto me ha dado bastante guerra, hasta que descubrí que había que hacerlo, porque tras la autenticación siempre me volvía a la URL con protocolo http y me daba error.

properties

Tras todos estos pasos, ya tenemos todo nuestro proyecto configurado para poder usar la API de Office 365 para los servicios que le hemos concedido permisos. Además si lo hemos hecho todo bien, veremos que si vamos a nuestro Azure AD, al apartado de aplicaciones y a su configuración, se ha configurado correctamente, y se han concedido los permisos necesarios y creado las claves correspondientes, además de que todo esto se habrá reflejado correctamente en nuestro web.config

Ahora llega el momento del código.

El código para acceder a la API de SharePoint

En mi caso, he metido todo el código dentro del método de la acción Index del controlador, al tratarse de un código de ejemplo, no he querido complicarlo mucho creando una clase de servicio y demás aspectos de “mejores prácticas”, que se pueden o se deben hacer. Eso lo dejo para más adelante ;).

En el caso del ejemplo, lo que voy a hacer es mostrar en una lista, toda la información de los archivos que tengo en mi One Drive, ordenados de mayor a menor tamaño.

El código para trabajar con la API, puede resultar enrevesado y un poco engorroso al principio, pero al final, una vez que trabajas con él, te das cuenta que una parte importante, se repite siempre para todos los servicios y es común a todos, y que solo hay que cambiar la parte correspondiente a cada servicio concreto. Os pongo el código completo y os voy contando las partes más importantes.

public async Task<ActionResult> Index(string code)
{
     try
     {
          DiscoveryClient disco = Helpers.GetFromCache("DiscoveryClient&quot;) as DiscoveryClient;
          SharePointClient sharepointClient = Helpers.GetFromCache("SharePointClient") as SharePointClient;
          CapabilityDiscoveryResult filesDisco = Helpers.GetFromCache("CapabilityDiscoveryResult") as CapabilityDiscoveryResult;
          string authorized = Helpers.GetFromCache("authorized") as string;

          AuthenticationContext authContext = new AuthenticationContext(
             ConfigurationManager.AppSettings["ida:AuthorizationUri"] + "/common",
                   true);

          ClientCredential creds = new ClientCredential(
              ConfigurationManager.AppSettings["ida:ClientID"],
              ConfigurationManager.AppSettings["ida:Password"]);

          //1.- Looking for authentication code to get the discovery service
          if (code == null && disco == null)
          {
              Uri redirectUri = authContext.GetAuthorizationRequestURL(
                  discoResource,
                  creds.ClientId,
                  new Uri(Request.Url.AbsoluteUri.Split('?')[0]),
                  UserIdentifier.AnyUser,
                  string.Empty);

              return Redirect(redirectUri.ToString());
          }

          //2.- Getting the discovery client
          if (code != null && disco == null)
          {
              disco = new DiscoveryClient(new Uri(discoEndpoint), async () =>
              {

                  var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
                      code,
                      new Uri(Request.Url.AbsoluteUri.Split('?')[0]),
                      creds);

                  return authResult.AccessToken;
              });

              Helpers.SaveInCache("DiscoveryClient", disco);
          }

          //3.- Getting the capabilites to access to one drive files
          if (filesDisco == null)
          {
              filesDisco = await disco.DiscoverCapabilityAsync("MyFiles");
              Helpers.SaveInCache("CapabilityDiscoveryResult", filesDisco);
          }

          //4.- Looking for authentication to get sharepoint service
          if (filesDisco != null && authorized == null)
          {
              Helpers.SaveInCache("authorized", "");

              Uri redirectUri = authContext.GetAuthorizationRequestURL(
                  filesDisco.ServiceResourceId,
                  creds.ClientId,
                  new Uri(Request.Url.AbsoluteUri.Split('?')[0]),
                  UserIdentifier.AnyUser,
                  string.Empty);

              return Redirect(redirectUri.ToString());
          }

          //5.- Getting sharePoint Client
          if (sharepointClient == null)
          {
              sharepointClient = new SharePointClient(filesDisco.ServiceEndpointUri, async () =>
              {
                  var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
                      code,
                      new Uri(Request.Url.AbsoluteUri.Split('?')[0]),
                      creds);

                  return authResult.AccessToken;
              });

              Helpers.SaveInCache("SharePointClient", sharepointClient);
          }

          //6.- Reading files from sharepointClient
          var onedrivefiles = await sharepointClient.Files.ExecuteAsync();

          var filesOrdered = from files in onedrivefiles.CurrentPage
                             orderby files.Size descending
                             select files;

          List<OneDriveFile> modelList = new List<OneDriveFile>();

          //7.- Adding model list from files got from service
          foreach (var file in filesOrdered)
          {
              modelList.Add(new OneDriveFile
              {
                  Name = file.Name,
                  Size = file.Size,
                  Created = file.DateTimeCreated
              });
          }

          ViewBag.files = modelList;

          return View();
      }
      catch (Exception ex)
      {
          return View("Error");
      }
}
  1. Lo primero que haremos será es solicitar el token de autenticación en el caso de que no exista para poder acceder al servicio discovery
  2. El segundo paso, es obtener un discoveryClient a partir del token obtenido previamente y que nos servirá para solicitar las capacidades que necesitemos de la API de Office 365
  3. Tras esto, se solicitan las capacidades al servicio de discovery que habíamos cargado previamente.
  4. El siguiente paso, es solicitar el token de autenticación para el servicio correspondiente a la capacidad solicitada, si no está disponible. Hasta este punto, para todas las APIs de Office 365 es común, la única diferencia, es la capacidad que requeriremos en cada ocasión, lo que lo hace un buen candidato para encapsular correctamente, por eso decía antes que aunque pueden resultar engorrosos todos los pasos, el funcionamiento luego es muy repetitivo. En este caso, hemos solicitado la capacidad “MyFiles” para obtener la información de OneDrive.
  5. A continuación obtenemos un SharePointClient, para acceder ya al servicio de OneDrive
  6. En este momento, leemos los archivos y usando LinQ los ordenamos por tamaño
  7. Y ya para terminar los metemos en una lista del modelo de datos que hemos definido para mostrarlo en la vista posteriormente

Para el ejemplo he creado un modelo llamado OneDriveFile que os pongo también a continuación

public class OneDriveFile
{
    public string Name{ get; set;}
    public double Size{ get; set;}
    public DateTimeOffset Created {get; set;}
}

El resultado

Si ejecutamos el código, o lo depuramos, veremos, tras solicitar la autenticación contra el Azure AD, que nos muestra los archivos que tengo en mi One Drive de Office 365, y ordenados de mayor a menos tamaño

resultado

En mi caso la mayoría, de algunos eventos de desarrollo a los que he asistido y de los que aprendo casi todo :).

Antes de terminar, os dejo referencia de la información que me ha servido a mí para poder llevar a cabo este código, y que ha partido de un evento al que asistí con la gente de MadPoint, donde hicieron un ejemplo incluso más extenso que este sobre el uso de la API de Office 365. Yo básicamente he partido de ese código, y lo que he aprendido ha sido a hacer todas las configuraciones necesarias para que funcione, y modificar el mismo para que se ajuste exactamente al tipo de ejemplo que quería hacer, que si que se diferencia un poco del que se hizo en el evento. No obstante gracias por todo lo que aprendí allí. Os dejo los enlaces.

http://www.sinsharepointnohayparaiso.com/recursos-y-documentos

https://github.com/MadPoint/Eventos/tree/master/2015.02%20Prepara%20tus%20apps%20de%20SharePoint%20y%20Office%20365%20para%20el%20futuro

Y nada más por ahora, espero que os sirva este ejemplo, yo hasta que he configurado bien todos los aspectos, el registro de la app, los permisos, las URLs de retorno y todo lo necesario, he pasado algún tiempo entretenido.

Un saludo y hasta la próxima.

Anuncios

Un comentario en “Usando la API de Office 365

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s