c# - microsoftgraph - Outlook Exchange Office 365: cómo obtener la dirección de correo electrónico del token de acceso?
outlook calendar api javascript (2)
Actualmente, estoy siguiendo este artículo https://dev.outlook.com/restapi/tutorial/dotnet . Todo funciona bien, espero no poder recuperar la dirección de correo electrónico del usuario de acess-token.
private string GetEmailFromIdToken(string token) {
// JWT is made of three parts, separated by a ''.''
// First part is the header
// Second part is the token
// Third part is the signature
string[] tokenParts = token.Split(''.'');
if (tokenParts.Length < 3) {
// Invalid token, return empty
}
// Token content is in the second part, in urlsafe base64
string encodedToken = tokenParts[1];
// Convert from urlsafe and add padding if needed
int leftovers = encodedToken.Length % 4;
if (leftovers == 2) {
encodedToken += "==";
} else if (leftovers == 3) {
encodedToken += "=";
}
encodedToken = encodedToken.Replace(''-'', ''+'').Replace(''_'', ''/'');
// Decode the string
var base64EncodedBytes = System.Convert.FromBase64String(encodedToken);
string decodedToken = System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
// Load the decoded JSON into a dynamic object
dynamic jwt = Newtonsoft.Json.JsonConvert.DeserializeObject(decodedToken);
// User''s email is in the preferred_username field
return jwt.preferred_username;
}
En algún artículo, la gente dice agregar "openid"
private static string[] scopes = { "openid", "https://outlook.office.com/mail.read",
"https://outlook.office.com/calendars.read" };
en la mira. Sin embargo, todavía no funciona. Ni siquiera da un inicio de sesión exitoso, arroja una excepción. Cuando no agrego el "código abierto", obtengo un inicio de sesión exitoso, sin embargo, el nombre de usuario preferido está vacío.
¡Esa es una buena captura!
Debe incluir el ámbito de "perfil" para leer el nombre de usuario preferido,
private static string[] scopes = { "profile",
"https://outlook.office.com/mail.read",
"https://outlook.office.com/calendars.read" };
Alternativamente, intente usar el alcance "contacts.read"
private static string[] scopes = { "https://outlook.office.com/contacts.read",
"https://outlook.office.com/mail.read",
"https://outlook.office.com/calendars.read" };
Obtenga más información sobre los ámbitos de permisos en https://github.com/OfficeDev/microsoft-graph-docs/blob/master/content/authorization/permission_scopes.md
He visto algunos casos en los que el reclamo de preferred_username
no es una dirección SMTP, por lo que no es la mejor manera de obtener la dirección de correo electrónico del usuario. Yo recomendaría en lugar de analizar el token de identificación, solo hacer una llamada a GET /Me
, que debería incluir una propiedad EmailAddress
.
Estoy volviendo a trabajar el tutorial en dev.outlook.com para hacer esto.