如何使用 OneDrive/Graph API 检索用户名、电子邮件和图像?

How to retrieve username, email and image with OneDrive/Graph APIs?

我正在开发一个 UWP 应用程序,我正在考虑从旧的 LiveSDK (which is discontinued and was last updated around 2015) to the new OneDriveSDK (the Graph APIs), specifically using the UWP Community Toolkit Services package and its APIs

就登录和 files/folders 管理而言,该库似乎很容易使用,但到目前为止我还没有找到一种方法来检索用户全名、用户电子邮件和头像。

这是我目前使用的代码,使用 LiveSDK(此处简化了代码):

public static async Task<(String username, String email)> GetUserProfileNameAndEmailAsync(LiveConnectSession session)
{
    LiveConnectClient connect = new LiveConnectClient(session);
    LiveOperationResult operationResult = await connect.GetAsync("me");
    IDictionary<String, object> results = operationResult.Result;
    String username = results["name"] as String;
    if (!(results["emails"] is IDictionary<string, object> emails)) return default;
    String email = emails["preferred"] as String ?? emails["account"] as String;
    return (username, email);
}

public static async Task<ImageSource> GetUserProfileImageAsync([NotNull] LiveConnectSession session)
{
    LiveConnectClient liveClient = new LiveConnectClient(session);
    LiveOperationResult operationResult = await liveClient.GetAsync("me/picture");
    String url = operationResult.Result?["location"] as String;

    // The URL points to the raw image data for the user profile picture, just download it
    return default;
}

我查看了指南 here,发现似乎可以替代上述所有内容,但我无法将其与 UWP 工具包服务集成。例如,要检索用户信息,这是我尝试过的方法:

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me/");
await OneDriveService.Instance.Provider.AuthenticationProvider.AuthenticateRequestAsync(request);
using (HttpResponseMessage response = await OneDriveService.Instance.Provider.HttpProvider.SendAsync(request))    
{
    String content = await response.Content.ReadAsStringAsync();    
}

但这失败了,在 SendAsync 调用时出现异常。

注意: 我知道 UWP 工具包中也有 Graph APIs,具有检索用户信息和个人资料图片的现成方法,但是显然你需要 office 365 订阅才能使用这些 API(作为开发人员,也可能作为用户),所以我想这不是我在这里寻找的,因为我一直能够使用检索这些信息一个普通的 OneDrive 客户端。

有没有办法在 UWP 上执行此操作,可以通过 UWP 工具包中的某种方法,也可以使用其他一些解决方案?

谢谢!

编辑: 我重新使用了示例应用程序中的代码,注册了我的应用程序以获取 clientID 并进行了快速测试,但它没有按预期工作,我'我收到此异常:

已修复,见下文

编辑 #2: 根据 this 的问题,我必须切换到 https://graph.microsoft.com/beta 才能获取个人资料图片,因为 1.0 版本的 API 目前不支持普通 MS 帐户。考虑到所有因素,它现在似乎运行良好

我按照 MSDN 文档为 Microsoft Graph 注册了我的应用程序。之后,我将获得一个应用程序 ID(在 API 中,它被称为 clientId)。

然后,我使用 Microsoft Graph Connect Sample for UWP 使用我的通用 MS 帐户登录。它运作良好。我可以获得 usernameemail

请注意,如果您想 运行 此示例成功,您需要使用应用程序 ID 来初始化 AuthenticationHelper.cs 中的 PublicClientApplication 对象。

public static PublicClientApplication IdentityClientApp = new PublicClientApplication("your client id");