尝试获取用户电子邮件时出现Outlook REST API 403错误

问题描述:

我正尝试使用Outlook REST API从用户的Outlook邮件中获取电子邮件。我已经能够成功地验证用户,并得到用户的访问令牌,但是,当我试图让一个AJAX调用到Outlook REST API,我得到以下错误:尝试获取用户电子邮件时出现Outlook REST API 403错误

GET https://outlook.office.com/api/v2.0/me/messages?callback=jQuery31008093694845457056_1490285639120 403 (Forbidden) 

而且,我获得以下从error错误的AJAX回调函数:

Object {readyState: 4, status: 404, statusText: "error"} 

这里是我的代码:

var ADAL = new AuthenticationContext({ 
    instance: 'https://login.microsoftonline.com/', 
    tenant: 'common', 
    clientId: '',  //Intentionally left blank here 

    redirectUri: 'http://localhost:8383/',  
    callback: userSignedIn, 
    popUp: true 
}); 

function signIn() { 
    ADAL.login(); 
} 

function userSignedIn(err, token) { 
    console.log('userSignedIn called'); 
    if (!err) { 
     console.log(token);   //This works! 
     fetchUserSentMails(token); 
    } else { 
     console.error("error: " + err); 
    } 
} 

function fetchUserSentMails(token) { 
    var user = ADAL.getCachedUser(); 
    console.log(user.profile.name);  //This works! 

    $.ajax({     //This doesn't work 
     type: 'GET', 
     crossDomain: true, 
     url: 'https://outlook.office.com/api/v2.0/me/messages', 
     dataType: 'jsonp', 
     headers: {'Authorization': 'Bearer ' + token}, 
     success: function (res) { 
      console.log(res); 
     }, 
     error: function (x, t, m) { 
      console.log(x); 
      console.log(t); 
      console.log(m); 
     } 
    }); 
} 

我在做什么错?

最有可能的答案是您的令牌没有适当的范围。在https://jwt.io解析您的令牌并查看scp声明中的内容。

看起来你错过了对AcquireToken的呼叫。 login方法只是签署用户并获得他们的身份,它不提供访问令牌。你需要这样的事情:

ADAL.acquireToken("https://outlook.office.com", function(error, accessToken){ 
    if (error) { 
    console.log('ERROR: ' + JSON.stringify(error)); 
    } else { 
    fetchUserSentMails(accessToken); 
    } 
} 
+0

我猜我得到的令牌是'id_token'而不是'access_token'来访问Outlook邮件API..am我正确?? –

+0

是的。我将用我认为你错过的一些代码更新我的答案。 –

+0

我添加了该代码。但是,我收到'错误:“由于超时导致令牌更新操作失败”错误。我搜索了这个错误,并在上面的代码之前添加了'ADALContext.handleWindowCallback()',但是,这会启动一个无限循环。我甚至尝试从chrome开发工具的“本地存储”中清除过期的'id_tokens',但仍然出现同样的错误。我究竟做错了什么?? –

我看到你正在收到超时错误。我有与超时完全相同的问题,我只能通过操作adal.js库来解决这个问题。在这个库中有一个6秒的超时时间,对于一些本地加载的应用程序来说它似乎非常紧张。要进行快速测试,您可以在adal.js中找到LOADFRAME_TIMEOUT:'6000',并将其替换为LOADFRAME_TIMEOUT:'30000',这会让您有30秒的时间来加载应用程序。我希望这个对你有用!