Microsoft Graph - 尝试获取电子邮件列表会产生400 Bad Request

时间:2018-01-19 15:21:38

标签: c# oauth-2.0 office365 microsoft-graph

使用MS Graph Docs尝试使用Access without user flow作为参考,从我的Office365邮箱获取电子邮件。我能够获得持票人令牌。 JWT的角色数组包含:

roles: [  "Mail.ReadWrite", "Mail.Read" ]

这是我正在使用的代码。它在“最后一行”上得到了400。

        var web = new WebClient();
        web.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");

        url = $"https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token";

        var reqparm = new System.Collections.Specialized.NameValueCollection();
        reqparm.Add("client_id", cliID);
        reqparm.Add("scope", "https://graph.microsoft.com/.default");            
        reqparm.Add("client_secret", secret);
        reqparm.Add("grant_type", "client_credentials");

        var responsebytes = web.UploadValues(url, "POST", reqparm);
        string responsebody = Encoding.UTF8.GetString(responsebytes);
        var data = JsonConvert.DeserializeObject<RootObject>(responsebody);

        web = new WebClient();
        web.Headers.Add( HttpRequestHeader.Authorization, "Bearer " + data.access_token);            
        var url2 = "https://graph.microsoft.com/v1.0/me/messages";
        var messages = web.DownloadString(url2);

为了确保WebClient不是GET以外的其他东西,我还尝试了一个带有method =“GET”的HttpWebRequest,结果相同。

这是POCO:

    public class RootObject
    {
        public string token_type { get; set; }
        public int expires_in { get; set; }
        public string access_token { get; set; }
    }

2 个答案:

答案 0 :(得分:2)

在没有用户进行身份验证时,您无法使用/me。这是因为图形的上下文中没有用户将/me翻译成。

对于此方案,您需要指定要为其列出消息的user资源:

https://graph.microsoft.com/v1.0/users/{userPrincipalName}/messages

答案 1 :(得分:1)

https://graph.microsoft.com/v1.0/users/{userPrincipalName}/messages

正如@MarcLeFleur所说,这是用户原则;所以我在电子邮件中尝试了用户名并且没有用。我使用完整的电子邮件地址作为委托人和中提琴!