Destripando el nuevo endpoint de Profile en MS Graph API

Escrito por  Luis Mañez

Desde hace un tiempo, Microsoft ha mejorado bastante la información de "Profile" que podemos usar desde MS Graph API. De momento este endpoint de Profile sólo está disponible dentro de la versión Beta de MS Graph. En este artículo vamos a ver de qué se compone este nuevo endpoint, y también como podemos utilizarlo, tanto desde un SPFx webpart, como dentro de una aplicación de consola.

¡Vamos a ello!

Profile endpoints

La siguiente table muestra todos los endpoints disponibles, así como una breve descripción de su funcionalidad (la mayoría son autodescriptivos con sólo ver el nombre del endpoint)

EndpointDescripciónOperaciones
/profileObtiene el profileGET, DELETE
completo de un usuario
/profile/accountInformaciónGET (read-only data)
específicamente
enlazada a una cuenta
de usuario
/profile/addressesRepresenta unaGET, CREATE, UPDATE,
dirección física yDELETE
detalles de su
localización.
/profile/anniversariesInformación de fechasGET, CREATE, UPDATE,
relevantes para elDELETE
usuario
/profile/awardsPremios asociados alGET, CREATE, UPDATE,
usuarioDELETE
/profile/certificationsCertificaciones oGET, CREATE, UPDATE,
nombramientos asociadosDELETE
al usuario
/profile/educationalActivitiesRepresenta informaciónGET, CREATE, UPDATE,
que el usuario haDELETE
proporcionado relativa
a actividades
educacionales
(graduado, postgrado,
etc)
/profile/emailsInformación sobreGET, CREATE, UPDATE,
direcciones de EmailDELETE
asociadas al usuario
/profile/interestsInformación sobreGET, CREATE, UPDATE,
intereses asociados alDELETE
usuario
/profile/languagesIdiomas asociados alGET, CREATE, UPDATE,
usuarioDELETE
/profile/namesAsociar otros nombresGET, CREATE, UPDATE,
al usuarioDELETE
/profile/notesNotas asociadas alGET, CREATE, UPDATE,
usuarioDELETE
/profile/patentsRepresenta una patenteGET, CREATE, UPDATE,
concedida, que ha sidoDELETE
añadida al perfil del
usuario
/profile/phonesPermite asociarGET, CREATE, UPDATE,
diferentes números deDELETE
teléfono al perfil del
usuario
/profile/positionsRepresenta informaciónGET, CREATE, UPDATE,
detallada de puestos deDELETE
trabajo asociados al
perfil del usuario
/profile/projectsInformación deGET, CREATE, UPDATE,
Proyectos en los que haDELETE
participado el usuario.
/profile/publicationsRepresenta unaGET, CREATE, UPDATE,
publicación o artículoDELETE
asociado al perfil del
usuario
/me/responsibilitiesProporciona informaciónGET, CREATE, UPDATE,
detallada sobreDELETE
responsabilidades que
el usuario ha asociado
consigo en varios
servicios
/profile/skillsInformación relativa aGET, CREATE, UPDATE,
habilidades oDELETE
conocimientos del
usuario
/profile/webAccountsRepresenta cuentas webGET, CREATE, UPDATE,
que el usuario haDELETE
indicado que posee o
usa
/profile/websitesSitios web asociados alGET, CREATE, UPDATE,
usuarioDELETE

Nota: Respecto a las Operaciones permitidas descritas en la tabla anterior, están basadas en la documentación oficial de Microsoft. Sin embargo, por mi experiencia, al menos usando Graph Explorer, hay operaciones que no me han funcionado. Por ejemplo, asociar un nuevo "name" a un usuario, o modificar el Nickname de un "name" ya existente no me ha funcionado. Del mismo modo, crear un nuevo item dentro de "responsibilities", tampoco. Por lo que he podido probar, parece que cierta información del Profile, viene sincronizada desde otros sistemas, como Azure Active Directory, y no puede actualizarse si no es desde esa aplicación externa, por ejemplo, el portal de Azure AD.

Y ahora que ya hemos visto la gran cantidad de información de perfil que podemos asignar a un usuario... ¿no es suena de algo toda esa información?... si la respuesta es sí, enviarme solicitud de conexión en LinkedIn... si habéis respondido que no os suena de nada, os recomiendo que os creéis un perfil de LinkedIn (y luego me enviáis solicitud de conexión).

Algunos Endpoints en acción

Vamos a jugar con algunos de los endpoints para obtener o añadir información, y lo haremos tanto estudiando el formato de Request, como viendo algo de código, tanto dentro de un WebPart SPFx, como en una aplicación de consola con c#.

Awards

Para obtener un listado de Awards, debemos hacer una petición HTTP GET a la siguiente URL:

image1

Y la respuesta tiene esta pinta:

image2

Para obtener el listado de Awards desde SPFx, podemos hacerlo con el siguiente snippet:

image3

Nota: La clase AwardsService definida arriba, hace uso del objeto ServiceScope proporcionado por el propio framework SPFx. De esta manera podemos sacar el objeto de tipo MSGraphClientFactory ya inyectado también por SPFx.

Skills

Vamos ahora a ver cómo podemos listar los Skills asociados a nuestro Profile, así como la creación de un nuevo Skill. En este caso, vamos a hacerlo desde un proyecto de Consola, con .NET 6 y C#. Antes de saltar al código, veamos la pinta de una Request para la creación de un Skill, y así conocer todas las posibles propiedades que podemos asociar a un Skill, y que por tanto recuperaremos en el listado de Skills.

image4

image5

¡Pasamos al código!

Por suerte, aunque estos endpoints forman parte de la versión Beta, ya están disponibles en el SDK de Graph Beta. Además, para la Authorization con MS Graph API, haremos uso del SDK de Azure Identity (si quieres saber más sobre cómo conectar a MS Graph con el SDK de Azure Identity, podéis revisar el siguiente artículo que también publiqué en CompartiMOSS hace un par de números: Introducción a Azure Identity SDK y uso con MS Graph API | CompartiMOSS).

Aquí asumimos que ya tenemos registrada una aplicación en Azure AD con los permisos necesarios para poder utilizar el endpoint de Skills.

Primero, los paquetes Nuget instalados:

1<ItemGroup>
2 <PackageReference Include="Azure.Identity" Version="1.6.0" />
3 <PackageReference Include="Microsoft.Graph.Beta" Version="5.4.0-preview" />
4</ItemGroup>
5

Ahora, para obtener un cliente de Graph, haremos:

1string[] scopes = { "User.ReadWrite.All" };
2var options = new InteractiveBrowserCredentialOptions
3{
4 ClientId = "",
5 TenantId = "",
6 RedirectUri = new Uri("http://localhost")
7};
8
9var credentials = new InteractiveBrowserCredential(options);
10var graphServiceClient = new GraphServiceClient(credentials, scopes);
11

El código anterior nos levantará un browser para logarnos en la Tenant y obtener un Token de Authorization con permisos Delegados (contexto del usuario logado).

Ahora, ya podemos usar el GraphServiceClient para listar nuestros Skills:

1var skillsResponse = await
2graphServiceClient.Me.Profile.Skills.GetAsync();
3
4var mySkills = skillsResponse.Value;
5
6foreach (var skill in mySkills)
7{
8 Console.WriteLine(skill.DisplayName);
9}
10

Ahora, para crear un nuevo Skill, el SDK nos lo pone realmente fácil:

1var skillCreated = await graphServiceClient.Me.Profile.Skills.PostAsync(
2 new Microsoft.Graph.Beta.Models.SkillProficiency { DisplayName = "Typescript"});
3
4Console.WriteLine($"New skill {skillCreated.DisplayName} created with Id: {skillCreated.Id}");
5
6

Pero... y ¿qué pinta Delve en todo esto?

Los más veteranos de SharePoint, recordarán que antiguamente SharePoint tenía una página de Perfil de usuario, el MySites, y que tanto con SharePoint OnPremises (OnPre... what?), a través de los antiguos WebParts en .NET, como luego en SP Online, con algo de hacking y JavaScript, dicha página se podía personalizar, mostrando información de otros sistemas.

Sin embargo, hace unos cuántos años (diría que sobre 2014), Microsoft le dio pasaporte al MySites, y algo llamado Delve, llegó a nuestras vidas. Si miramos hoy las secciones de Delve, donde el usuario puede editar su perfil, vemos lo siguiente:

image6

Projects, Skills, Education... se parece bastante a los endpoints que hemos comentado dentro de Graph Profile, ¿verdad?... pues si os estáis preguntando si la información almacenada desde Delve, está disponible desde el Profile endpoint de Graph... lo siento mucho pero la respuesta es NO. No parece que tan siquiera haya una integración de datos en background.

¿Qué significa esto?... pues no os lo sé decir, pero tengo la sensación de que Delve no es tampoco la solución al perfil de usuario, y que, o bien será sustituida por otra cosa, o bien se modificará internamente para que la información salga de MS Graph... el tiempo dirá.

¡Hasta el próximo artículo!

Luis Mañez
Cloud Architect en ClearPeople LTD
@luismanez
https://github.com/luismanez

Siguemos en LinkedInSiguemos en Twitter
Powered by  ENCAMINA